I. La constante __NAMESPACE__

__NAMESPACE__ est une chaîne PHP qui retourne toujours le nom de l'espace de noms courant. Dans l'espace global, elle renverra une chaîne vide.

 
Sélectionnez
<?php
namespace App\Lib1;
echo __NAMESPACE__;
// sortie : App\Lib1
?> 

La valeur présente des avantages évidents durant le débogage. Elle peut également être utilisée pour générer dynamiquement un nom de classe entièrement qualifié, par exemple :

 
Sélectionnez
<?php  
 namespace App\Lib1;  
 
 class MyClass {  
     public function WhoAmI() {  
         return __METHOD__;  
     }  
 }  
 
 $c = __NAMESPACE__ . ' \\MyClass';  
 $m = new $c;  
 echo $m->WhoAmI(); // sortie : App\Lib1\MyClass::WhoAmI  
 ?> 

II. Le mot clé namespace

Le mot clé namespace peut être utilisé pour référencer explicitement un élément dans l'espace de nom courant ou un sous-espace de noms. C'est l'équivalent dans les espaces de noms de self au sein des classes :

 
Sélectionnez
 <?php  
 namespace App\Lib1;  
 
 class MyClass {  
     public function WhoAmI() {  
         return __METHOD__;  
     }  
 }  
 
 $m = new namespace\MyClass;  
 echo $m->WhoAmI(); // sortie : App\Lib1\MyClass::WhoAmI  
 ?> 

III. Autoloading des classes d'un espace de noms

L'un des meilleurs moyens de gagner du temps avec PHP 5 est l'autoloading. À l'échelle globale (non-espace de noms) du code PHP, une fonction de chargement automatique standard pourrait être écrite comme ceci :

 
Sélectionnez
<?php  
$obj1 = new MyClass1(); // classes/MyClass1.php is auto-loaded  
$obj2 = new MyClass2(); // classes/MyClass2.php is auto-loaded  

// autoload function  
function __autoload($class_name) {  
    require_once("classes/$class_name.php");  
}  
?> 

En PHP 5.3, vous pouvez créer une instance d'une classe d'espace de noms. Dans cette situation, l'espace de noms entièrement qualifié et le nom de classe sont passés à la fonction __autoload(), par exemple la valeur de $class_name pourrait être App\LIB1\MyClass. Vous pouvez continuer à mettre tous vos fichiers de classe PHP dans le même dossier et y chainer l'espace de nom, cependant, cela pourrait entraîner des conflits de nom de fichier.

Alternativement, la hiérarchie de vos fichiers de classes pourraient être organisée de la même manière que la structure de votre espace de noms. Par exemple, un fichier MyClass.php pourrait être créé dans le dossier /classes/App/Lib1 :

/classes/App/Lib1/MyClass.php
Sélectionnez

<?php  
namespace App\Lib1;  

class MyClass {  
    public function WhoAmI() {  
        return __METHOD__;  
    }  
}  
?>

Un fichier dans le dossier racine pourrait alors utiliser le code suivant :

myapp.php
Sélectionnez
<?php  
use App\Lib1\MyClass as MC;  

$obj = new MC();  
echo $obj->WhoAmI();  

// autoload function  
function __autoload($class) {  
 
// convert namespace to full file path  
$class = 'classes/' . str_replace('\\', '/', $class) . '.php';  
require_once($class);  
 
}  
?> 

Explications :

  • La classe \LIB1\MyClass est aliassée en tant que MC.
  • new MC() est traduit par new App\Lib1\MyClass() pendant la compilation.
  • La chaîne App\LIB1\MyClass est passé à la fonction __autoload. Cela remplace tous les antislash de l'espace de noms avec le chemin du fichier avant le slash, et modifie la chaîne si le fichier classes\App\LIB1\ MyClass.php est chargé.

IV. Liens

Vous pouvez aussi aller voir mes autres traductions.

Merci à Furr pour sa relecture orthographique.