Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] przesztrzeń nazw i use
Forum PHP.pl > Forum > Przedszkole
gosss
Ktoś mi wyjaśni dlaczego poniższy kod nie działa?

  1. use App\Controller\Test;
  2. new Test;
  3.  
  4. use App\Model\Test;
  5. new Test;


A jak napiszę
  1. use App\Controller\Test;
  2. new Test;
  3.  
  4. new App\Model\Test;


To jest już ok...

Wyskakuje komuniakt

Cytat
Fatal error: Cannot use App\Model\Test as Test because the name is already in use in


I rozumiem go, ale przecież odwołane jest zupełnie inne, tam jest do kontrolera a później do modelu... to jak w końcu korzystać z tych przestrzeni?
viking
Po pierwsze oba use wstawiasz na początku. Po drugie jak widzisz masz 2x Test, musisz ustawić alias. Poczytaj w dokumentacji.
Gość
Przestrzenie nazw w PHP w ogóle nie są przemyślane.

Przykłądowo

  1. namespace App\Core
  2.  
  3. class Start
  4. {
  5.  
  6. }



  1. namespace App\Cos
  2.  
  3. class Art exends Start
  4. {
  5.  
  6. }


Art dziedziczy po Start, z tym że start szukany jest w katalogu gdzie jest Art. To jakaś parodia namespace...
Crozin
1. Pierwszy przykład nie działa Ci, ponieważ pod nazwą "Test" mogą kryć się dwie nazwy, którą z nich powinno się użyć? Niby można by powiedzieć, że tą, która została zadeklarowana jako ostatnia, ale taka niejednoznaczność byłaby bardzo irytująca i powodowałaby wiele błędów.
2. Co do drugiej kwestii z postu powyżej, to nie rozumiem Twojego zdziwienia. Przecież utworzyłeś klasę App\Core\Start oraz App\Cos\Art, która dziedziczy po Start (nieistniejąca klasa). Skąd PHP miałoby wiedzieć, że chodzi o Start z przestrzeni App\Core?
Gość
Crozin, bo to jest logiczne? PHP powinno sprawdzać co z czego pochodzi. Kożystam z SPLloadera https://gist.github.com/221634
Crozin
Logicznym byłoby, że jeżeli nie istnieje dyrektywa use deklarująca jakąś tam klasę Start z innej przestrzeni nazw, to w przypadku wystąpienia nazwy Start zostanie założone, że odnosi się ona do aktualnej przestrzeni nazw, czyli pełna nazwa klasy to App\Cos\Start.
Dlaczego niby PHP miałby uznać, że może chodzić o App\Core\Start?

PS. Ten autoloader jest źle napisany - metoda loadClass() musi zwracać wartość logiczną true/false, ta zawsze zwraca nulla.
Gość
Znasz jakiś lepszy który działa na podobnej zasadzie i nie jest kobyłą?

Czyli że przed użyciem new Art, mam napisać use App\Core\Start ?
Crozin
Cytat
Znasz jakiś lepszy który działa na podobnej zasadzie i nie jest kobyłą?
ClassLoader z Symfony2? http://symfony.com/doc/current/components/class_loader.html
Cytat
Czyli że przed użyciem new Art, mam napisać use App\Core\Start ?
Albo używasz use albo podajesz pełną nazwę klasy:
  1. namespace App\Cos;
  2.  
  3. use App\Core\Start;
  4.  
  5. class Art extends Start { ... }
  1. namespace App\Cos;
  2.  
  3. class Art extends App\Core\Start { ... }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.