Comment utiliser les espaces de noms en PHP Partie 3 : les mots clés et l'Autoloading

| Craig Buckler (Auteur) | Joris Crozier (Traducteur) |

Dans les parties 1 et 2 de cette série, nous avons examiné les bases des espaces de noms en PHP, l'opérateur pour l'utilisation et la résolution de nom. Dans ce dernier article, nous abordons les options des espaces de noms les plus avancés.

Commentez

- Titre : Comment utiliser les espaces de noms en PHP Partie 3 : les mots clés et l'Autoloading

- Auteurs : Craig Buckler (Auteur), Joris Crozier (Traducteur)

- Parution : 12 janvier 2010

- Mise à jour : 10 décembre 2019

- Licence : Copyright ® 2010 Joris CROZIER. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. La constante __NAMESPACE__

- II. Le mot clé namespace

- III. Autoloading des classes d'un espace de noms

- IV. Liens

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 :

/classes/App/Lib1/MyClass.php

<?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

<?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.