(PHP 5 >= 5.3.0, PHP 7)

Utilisation des espaces de noms : importation et alias

La capacité de faire référence à un nom absolu avec un alias ou en important un espace de noms est stratégique. C'est un avantage similaire aux liens symboliques dans un système de fichiers.

Toutes les versions de PHP qui supportent les espaces de noms supportent trois types d'alias ou d'importation : l'alias de nom de classe, l'alias de nom d'interface, et l'alias d'espace de noms. PHP 5.6+ autorise également les alias de fonctions ou l'importation de fonctions et des noms de constantes.

En PHP, l'alias est créé avec l'opérateur use. Voici un exemple qui présente les cinq types d'importation :

Exemple #1 importation et alias avec l'opérateur use

<?php
namespace foo;
use 
My\Full\Classname as Another;

// Ceci est la même chose que use My\Full\NSname as NSname
use My\Full\NSname;

// importation d'une classe globale
use ArrayObject;

// importation d'une function (PHP 5.6+)
use function My\Full\functionName;

// alias d'une fonction (PHP 5.6+)
use function My\Full\functionName as func;

// importation d'une constante (PHP 5.6+)
use const My\Full\CONSTANT;

$obj = new namespace\Another// instantie un objet de la classe foo\Another
$obj = new Another// instantie un objet de la classe My\Full\Classname
NSname\subns\func(); // appelle la fonction My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // instantie un objet de la classe ArrayObject
// Sans l'instruction "use ArrayObject" nous aurions instantié un objet de la classe foo\ArrayObject
func(); // Appel la fonction My\Full\functionName
echo CONSTANT// affiche la valeur de My\Full\CONSTANT
?>
Notez que pour les noms avec chemin (les noms absolus contenant des séparateurs d'espaces, tels que Foo\Bar, par comparaison avec les noms globaux, tels que FooBar, qui n'en contiennent pas), l'anti-slash initial n'est pas nécessaire et n'est pas recommandé, car les noms importés doivent être absolus et ne sont pas résolus relativement à l'espace de noms courant.

De plus, PHP supporte des raccourcis pratiques, tels que les commandes use multiples.

Exemple #2 importation et alias multiples avec l'opérateur use

<?php
use My\Full\Classname as AnotherMy\Full\NSname;

$obj = new Another// instantie un objet de la classe My\Full\Classname
NSname\subns\func(); // appelle la fonction My\Full\NSname\subns\func
?>

L'importation est réalisée à la compilation, ce qui fait que cela n'affecte pas les classes, fonctions et constantes dynamiques.

Exemple #3 Importation et noms d'espaces dynamiques

<?php
use My\Full\Classname as AnotherMy\Full\NSname;

$obj = new Another// instantie un objet de la classe My\Full\Classname
$a 'Another';
$obj = new $a;      // instantie un objet de la classe Another
?>

De plus, l'importation n'affecte que les noms sans qualification. Les noms absolus restent absolus, et inchangés par un import.

Exemple #4 Importation et noms d'espaces absolus

<?php
use My\Full\Classname as AnotherMy\Full\NSname;

$obj = new Another// instantie un objet de la classe My\Full\Classname
$obj = new \Another// instantie un objet de la classe Another
$obj = new Another\untruc// instantie un objet de la classe My\Full\Classname\untruc
$obj = new \Another\untruc// instantie un objet de la classe Another\untruc
?>

Règles de contextes pour l'importation

Le mot-clé use doit être déclaré dans le contexte le plus externe d'un fichier (le contexte global) ou alors dans les déclarations d'espace de noms. Ceci car l'importation est effectuée à la compilation et non durant l'éxecution, donc on ne peut empiler les contextes. L'exemple qui suit montre des utilisation incorrectes du mot-clé use:

Exemple #5 Règles d'importation incorrectes

<?php
namespace Languages;

function 
toGreenlandic
{
    use 
Languages\Danish;
    
// ...
}
?>

Note:

Les règles d'importation sont basées sur les fichiers, ce qui signifie que les fichiers inclus n'hériteront PAS des règles d'importation du fichier parent.

Déclaration du groupe use

Depuis PHP 7.0, les classes, fonctions et constantes peuvant être importées depuis le même namespace peuvent être regroupées dans une seule instruction use.

<?php

// Code avant PHP 7
use some\namespace\ClassA;
use 
some\namespace\ClassB;
use 
some\namespace\ClassC as C;

use function 
some\namespace\fn_a;
use function 
some\namespace\fn_b;
use function 
some\namespace\fn_c;

use const 
some\namespace\ConstA;
use const 
some\namespace\ConstB;
use const 
some\namespace\ConstC;

// Code avec PHP 7+
use some\namespace\{ClassAClassBClassC as C};
use function 
some\namespace\{fn_afn_bfn_c};
use const 
some\namespace\{ConstAConstBConstC};