Namespace

Déclarer un namespace

Tout comme un fichier appartient à un répertoire et deux fichiers de même nom ne peuvent exister dans le même répertoire, on peut placer des classes dans un namespace et éviter des conflits de nom. C’est utile sur les gros projets et pour les librairies.

La déclaration du namespace doit être la première instruction du fichier PHP (seules les lignes vides et lignes de commentaires peuvent être présentes avant le namespace).

namespace MonNamespace;

class A {}

Nom:

Le namespace répond aux mêmes exigences d’appellation qu’une variable, on ne peut donc pas utiliser

Sous-namespace:

Un sous-namespace est traité comme un namespace à part entière:
Example\Sub n’a pas accès à Example et inversemment.

Déclarer plusieurs namespaces:

Il est possible de déclarer plusieurs namespace à l’intérieur d’un même fichier,


Utiliser une entité dans un namespace

Lorsqu’on déclare un namespace, toutes les classes (classes abstraites, interfaces et traits y compris), fonctions et constantes dans ce fichier sont déclarées comme faisant partie du namespace.

Entités du namespace courant:

Toutes les entités du namespace courant sont directement accessibles, sans préfixe.

<?php
namespace Example;

function hello() {
    return "OK";
}
echo hello();

Entités d’un autre namespace:

Les entités d’un namespace différent doivent être

Lorsqu’on est dans un namespace, pour accéder à une classe qui n’est dans aucun namespace (déclarée dans le contexte global), il faut précéder le nom de la classe de la racine \.

<?php
namespace Example;

$date = new \DateTime();

Comportement des callbacks:

Les closures gardent le contexte courant, il n’est donc pas utile de préfixer les classes à l’intérieur.

<?php
$var = function() {
    return hello();
};
echo $var();

Les fonctions nommées par contre (lorsqu’on passe par une variable), perdent le contexte.

<?php
$var = 'Example\hello';
echo $var();

Alias de classe

La fonction class_alias permet de créer un alias de classe.
L’alias est déclaré dans le contexte global (donc à la racine).

<?php
//------ EXAMPLE ------
namespace Example;
class A {}

class_alias('Example\A', 'EA');
var_dump(new \EA);

//------ EXAMPLE\SUB ------
namespace Example\Sub;
var_dump(new \EA);