Sa propre fonction pour l'autoloading de classes en POO en PHP
Souvent, l'autoloading par défaut peut ne pas vous convenir pour certaines raisons. Dans un tel cas, vous pouvez écrire votre propre autoloader.
Pour cela, il faut passer en premier paramètre
à la fonction spl_autoload_register
votre fonction de rappel écrite par vous.
Cette fonction sera appelée lorsque PHP détectera
un accès à une classe non chargée. Le nom de la classe
avec son espace de noms sera passé en paramètre de cette fonction :
<?php
spl_autoload_register(function($class) {
// la variable $class contiendra le nom de la classe avec l'espace de noms
});
?>
Et la responsabilité de la fonction est de charger
cette classe via require en fonction de son nom.
C'est-à-dire qu'à l'intérieur de cette fonction, nous devons
définir notre propre règle pour le chargement des classes,
notre propre convention de nommage.
Écrivons un exemple d'autoloader personnalisé. Supposons, par exemple, que nous disions que le chemin vers le fichier de la classe depuis la racine du site sera le même que l'espace de noms, mais en conservant la casse des caractères.
Autrement dit, si nous avons une classe Core\Admin\PageController,
alors le chemin vers celle-ci devrait être Core/Admin/PageController.php.
Comme vous le voyez, pour transformer le nom de la classe
avec son espace de noms, il suffit de remplacer
les barres obliques inverses par des barres obliques normales,
et d'ajouter .php au nom de la classe.
Faisons cela :
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Cependant, nous obtiendrons un chemin relatif vers le fichier (relatif à la racine du site). Il est préférable de faire un chemin absolu, comme ceci :
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Il y a encore une subtilité. Dans différents systèmes d'exploitation,
le chemin des dossiers peut utiliser la barre oblique normale
ou la barre oblique inversée. Rendons notre code indépendant
du système d'exploitation. Pour cela, au lieu
de la barre oblique normale pour séparer les chemins, nous utiliserons
la constante DIRECTORY_SEPARATOR,
qui contient le bon séparateur pour le système d'exploitation
sur lequel notre script est exécuté. Au final, nous obtenons le code suivant :
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Testez la fonction d'autoloading que j'ai créée.
Inventez votre propre règle d'autoloading et implémentez-la.