Przestrzenie nazw PHP i „użycie”

120

Mam mały problem z przestrzeniami nazw i useinstrukcjami.

Mam trzy pliki: ShapeInterface.php, Shape.phpi Circle.php.

Próbuję to zrobić za pomocą ścieżek względnych, więc umieściłem to we wszystkich klasach:

namespace Shape; 

W mojej klasie w kręgu mam:

namespace Shape;
//use Shape;
//use ShapeInterface;

include 'Shape.php';
include 'ShapeInterface.php';    

class Circle extends Shape implements ShapeInterface{ ....

Jeśli korzystam z includeoświadczeń, nie otrzymuję żadnych błędów. Jeśli spróbuję usewyciągów, które otrzymuję:

Błąd krytyczny: nie znaleziono klasy „Shape \ Shape” w /Users/shawn/Documents/work/sites/workspace/shape/Circle.php w wierszu 8

Czy ktoś mógłby mi udzielić kilku wskazówek w tej sprawie?

Shawn Northrop
źródło
Również na ten temat - stackoverflow.com/questions/33341955/…
Peter

Odpowiedzi:

169

useOperator jest za danie aliasów do nazw klas, interfejsów lub innych nazw. Większość useinstrukcji odnosi się do przestrzeni nazw lub klasy, którą chcesz skrócić:

use My\Full\Namespace;

jest równa:

use My\Full\Namespace as Namespace;
// Namespace\Foo is now shorthand for My\Full\Namespace\Foo

Jeśli useoperator jest używany z nazwą klasy lub interfejsu, ma następujące zastosowania:

// after this, "new DifferentName();" would instantiate a My\Full\Classname
use My\Full\Classname as DifferentName;

// global class - making "new ArrayObject()" and "new \ArrayObject()" equivalent
use ArrayObject;

useOperator nie należy mylić z automatycznego ładowania . Klasa jest ładowana automatycznie (co wyklucza potrzebę include) przez zarejestrowanie autoloadera (np. Z spl_autoload_register). Możesz przeczytać PSR-4, aby zobaczyć odpowiednią implementację autoloadera.

cmbuckley
źródło
Więc jeśli utworzę inny plik o nazwie bootstrap.php i umieszczę w nim autoloader wraz z $ circle = new Circle (); Zawiera plik Circle.php, ale pojawia się błąd: Błąd krytyczny: Nie znaleziono klasy „Shape” w ... / Circle.php w wierszu 6. Wygląda na to, że ładuje się Circle.php, ale nie ładuje Shape.php Circle jest zdefiniowany as: klasa Koło rozszerza Narzędzia ShapeInterface
Shawn Northrop
Jeśli usunę przestrzeń nazw z powyższych klas, autoloader działa dobrze. Jednak kiedy mam przestrzeń nazw w interfejsie klasy kształtu, pojawia się powyższy błąd
Shawn Northrop
1
Stworzył streszczenie, aby podać przykład. Niestety streszczenia nie mogą mieć podfolderów. Umieść plik bootstrap.php w folderze, a pozostałe klasy w podfolderze o nazwie „Shape”.
cmbuckley
13

Jeśli chcesz uporządkować swój kod w przestrzeniach nazw, po prostu użyj słowa kluczowego namespace:

plik1.php

namespace foo\bar;

W pliku file2.php

$obj = new \foo\bar\myObj();

Możesz także użyć use. Jeśli w pliku2 umieścisz

use foo\bar as mypath;

musisz użyć mypathzamiast bargdziekolwiek w pliku:

$obj  = new mypath\myObj();

Używanie use foo\bar;jest równe use foo\bar as bar;.

Charlie
źródło