PHP Fare riferimento a una classe o funzione in un namespace


Esempio

Come mostrato in Dichiarare spazi dei nomi , possiamo definire una classe in uno spazio dei nomi come segue:

namespace MyProject\Shapes;

class Rectangle { ... }

Per fare riferimento a questa classe, è necessario utilizzare il percorso completo (incluso lo spazio dei nomi):

$rectangle = new MyProject\Shapes\Rectangle();

Questo può essere abbreviato importando la classe tramite l' use -statement:

// Rectangle becomes an alias to MyProject\Shapes\Rectangle
use MyProject\Shapes\Rectangle;

$rectangle = new Rectangle();

Per quanto riguarda PHP 7.0 è possibile raggruppare vari use -statements in una singola istruzione usando parentesi:

use MyProject\Shapes\{
    Rectangle,         //Same as `use MyProject\Shapes\Rectangle`
    Circle,            //Same as `use MyProject\Shapes\Circle`
    Triangle,          //Same as `use MyProject\Shapes\Triangle`
    
    Polygon\FiveSides, //You can also import sub-namespaces
    Polygon\SixSides   //In a grouped `use`-statement
};

$rectangle = new Rectangle();

A volte due classi hanno lo stesso nome. Questo non è un problema se si trovano in un namespace diverso, ma potrebbe diventare un problema quando si tenta di importarli con l' use -statement:

use MyProject\Shapes\Oval;
use MyProject\Languages\Oval; // Apparantly Oval is also a language!
// Error!

Questo può essere risolto definendo un nome per l'alias usando la parola chiave as :

use MyProject\Shapes\Oval as OvalShape;
use MyProject\Languages\Oval as OvalLanguage;

Per fare riferimento a una classe al di fuori dello spazio dei nomi corrente, è necessario eseguire l'escape con un \ , altrimenti viene assunto un percorso relativo al namespace dallo spazio dei nomi corrente:

namespace MyProject\Shapes;

// References MyProject\Shapes\Rectangle. Correct!
$a = new Rectangle();

// References MyProject\Shapes\Rectangle. Correct, but unneeded!
$a = new \MyProject\Shapes\Rectangle(); 

// References MyProject\Shapes\MyProject\Shapes\Rectangle. Incorrect!
$a = new MyProject\Shapes\Rectangle(); 


// Referencing StdClass from within a namespace requires a \ prefix
// since it is not defined in a namespace, meaning it is global.

// References StdClass. Correct!
$a = new \StdClass(); 

// References MyProject\Shapes\StdClass. Incorrect!
$a = new StdClass();