2012-05-10 14 views
82

Mam trochę problemów z przestrzeniami nazw i instrukcjami use.Przestrzenie nazw PHP i "użycie"

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

Próbuję to zrobić przy użyciu ścieżek względnych więc włożyłem to we wszystkich klasach:

namespace Shape; 

W mojej klasie okręgu Mam następujący:

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

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

class Circle extends Shape implements ShapeInterface{ .... 

Jeśli użyję oświadczenia include nie otrzymuję żadnych błędów. Gdy próbuję sprawozdań use uzyskać:

Fatal error: Class 'Shape\Shape' not found in /Users/shawn/Documents/work/sites/workspace/shape/Circle.php on line 8

Czy ktoś proszę mi dać trochę wskazówek na ten temat?

+0

Czytam to i nadal nie bardzo rozumiem. Czy pliki zewnętrzne będą dołączone do użycia? –

+0

Również w odniesieniu do tego tematu - http: // stackoverflow.com/questions/33341955/does-the-import-or-use-order-affect-functional-in-php – Peter

Odpowiedz

124

Numer use operator służy do podawania nazw klas, interfejsów lub innych przestrzeni nazw. Większość use stwierdzenia odnoszą się do nazw lub klasy, który chcesz skrócić:

use My\Full\Namespace; 

odpowiada:

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

Jeżeli operator use jest używany z klasy lub interfejsu nazwy, 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; 

operator use nie należy mylić z autoloading. Klasa jest ładowana automatycznie (zaprzeczając potrzebie include) poprzez zarejestrowanie autoloadera (np. Z spl_autoload_register). Możesz przeczytać PSR-4, aby zobaczyć odpowiednią implementację autoloadera.

+0

Awesome, Ill sprawdź to. Dzięki! –

+0

Więc jeśli utworzę inny plik o nazwie bootstrap.php i umieściłem autoloader wewnątrz wraz z $ circle = new Circle(); Obejmuje Circle.php, ale pojawia się błąd: Błąd krytyczny: klasa "Shape" nie występuje w .../Circle.php na linii 6. Wygląda na to, że ładuje Circle.php, ale nie ładuje Shape.php Circle jest zdefiniowany as: class Circle extends Shape tools ShapeInterface –

+0

Po usunięciu przestrzeni nazw z powyższych klas autoloader działa poprawnie. Jednak gdy mam przestrzeń nazw w interfejsie klasy kształtu, otrzymuję powyższy błąd –

4

Najprostszym sposobem, aby umieścić go

Jeśli chcesz zamówić swój kod do przestrzeni nazw, wystarczy użyć słowa kluczowego namespace.

W file1.php namespace foo\bar;

W file2.php $obj = new foo\bar\myObj();


Jeszcze trochę więcej do tej historii - słowo kluczowe use.

Jeśli powiesz w file2 use foo\bar as mypath oznacza to, że musisz użyć mypath zamiast foo\bar w dowolnym miejscu pliku. "

$obj = new mypath\myObj(); 

Gdybyś powiedział use foo\bar jest równa use foo\bar as bar

Powiązane problemy