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.
<?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 :
<?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 :
<?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 :
<?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 pourrait ê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 :
<?php
namespace
App\Lib1;
class
MyClass {
public
function
WhoAmI() {
return
__METHOD__
;
}
}
?>
Un fichier dans le dossier racine pourrait alors utiliser le code suivant :
<?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ée à 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.