par , 09/04/2018 à 23h11 (4249 Affichages)
Quand vous codez en POO (programmation orientée objet), le moteur PHP peut s'occuper à votre place de gérer les inclusions de fichiers contenant l'implémentation des classes moyennant la mise en place d'un découpage logique de votre application et l'utilisation des espaces de nom.
Les espaces de nom namespace permettent de ranger logiquement le code source et éviter ainsi un véritable bordel quand la quantité de scripts augmente ainsi que les fonctionnalités d'un site web. Le découpage que cela induit offre une propriété intéressante qui permet également dans les cas courants de trouver physiquement l'emplacement d'un fichier.
Concrètement le fichier définissant une classe Feuille et définie sur l'espace de nom namespace Meuble\Tiroir\Classeur; devra se trouver physiquement à cet emplacement Racine_du_site/Meuble/Tiroir/Classeur/Feuille.php. Ainsi il sera possible de transformer facilement le nom de la classe pleinement qualifié Meuble\Tiroir\Classeur\Feuille en chemin de fichier afin de s'assurer de son existence et dans l'affirmative, demander au moteur PHP de l'inclure automatiquement via le mécanisme d'autoloading.
De cette manière vous n'aurez plus jamais à faire des include ou autre require.
Le code ci-dessous s'occupe de cette transformation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?php
define('DIR_ROOT', __DIR__.DIRECTORY_SEPARATOR);
$autoloader = function($full_class_name) {
// on prépare le terrain : on remplace le séparteur d'espace de nom par le séparateur de répertoires du système
$name = str_replace('\\', DIRECTORY_SEPARATOR, $full_class_name);
// on construit le chemin complet du fichier à inclure :a
// il faut que l'autoloader soit toujours à la racine du site
$path = DIR_ROOT.$name.'.php';
// on vérfie que le fichier existe et on l'inclut
// sinon on passe la main à une autre autoloader (return false)
if (is_file($path)) {
include $path;
return true;
} else {
return false;
}
};
spl_autoload_register($autoloader); |
Une fois mis en place et déclaré, l'autoloader devrait vous faciliter grandement l'existence.
Au lieu de faire
1 2 3
| include_once ../../../Feuille.php;
$cls = new Feuille(); |
il faudra dorénavant faire où que vous soyez dans votre code
1 2 3
| use Meuble\Tiroir\Classeur\Feuille;
$cls = new Feuille(); |
et dans le code source de la classe Feuille :
1 2 3 4 5 6
| namespace Meuble\Tiroir\Classeur;
class Feuille
{
} |
N'oubliez pas de l'enregistrer dans l'arborescence des répertoires adéquate : Racine_du_site/Meuble/Tiroir/Classeur/Feuille.php.
Si vous observez bien, c'est la raison pour laquelle il est expressément exigé de n'avoir qu'une classe par fichier.