Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] przesztrzeń nazw i use
-gosss-
post 22.05.2012, 08:08:13
Post #1





Goście







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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
viking
post 22.05.2012, 08:33:54
Post #2





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Po pierwsze oba use wstawiasz na początku. Po drugie jak widzisz masz 2x Test, musisz ustawić alias. Poczytaj w dokumentacji.


--------------------
Go to the top of the page
+Quote Post
-Gość-
post 22.05.2012, 09:16:01
Post #3





Goście







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...
Go to the top of the page
+Quote Post
Crozin
post 22.05.2012, 09:26:00
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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 to the top of the page
+Quote Post
-Gość-
post 22.05.2012, 09:57:15
Post #5





Goście







Crozin, bo to jest logiczne? PHP powinno sprawdzać co z czego pochodzi. Kożystam z SPLloadera https://gist.github.com/221634
Go to the top of the page
+Quote Post
Crozin
post 22.05.2012, 10:15:22
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Crozin 22.05.2012, 10:24:12
Go to the top of the page
+Quote Post
-Gość-
post 22.05.2012, 10:41:31
Post #7





Goście







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 ?
Go to the top of the page
+Quote Post
Crozin
post 22.05.2012, 10:50:11
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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 { ... }
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 17:28