IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

rawsrc

Autoloader

Note : 3 votes pour une moyenne de 3,67.
par , 09/04/2018 à 22h11 (3884 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.

Code php : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
include_once ../../../Feuille.php;
 
$cls = new Feuille();
il faudra dorénavant faire où que vous soyez dans votre code
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
use Meuble\Tiroir\Classeur\Feuille;
 
$cls = new Feuille();
et dans le code source de la classe Feuille :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
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.

Envoyer le billet « Autoloader » dans le blog Viadeo Envoyer le billet « Autoloader » dans le blog Twitter Envoyer le billet « Autoloader » dans le blog Google Envoyer le billet « Autoloader » dans le blog Facebook Envoyer le billet « Autoloader » dans le blog Digg Envoyer le billet « Autoloader » dans le blog Delicious Envoyer le billet « Autoloader » dans le blog MySpace Envoyer le billet « Autoloader » dans le blog Yahoo

Mis à jour 12/04/2018 à 10h54 par rawsrc

Catégories
PHP , Développement Web

Commentaires

  1. Avatar de Dendrite
    • |
    • permalink
    Merci aussi pour ça, Raw.
    J'avais du mal à comprendre ces namespaces, enfin je comprenais bien l'intérêt théorique, mais je ne voyais pas comment les intégrer dans ma partition. J'adopte et je reviens vers toi si j'ai des questions !
  2. Avatar de Meiyo40
    • |
    • permalink
    Salut,

    Je suis en train de créer mon premier site en php et on m'a demandé d'utiliser un autoloader.

    Je comprends parfaitement le concept et je le trouve même séduisant, seulement je n'arrive pas à le mettre en oeuvre du coup j'ai quelques questions...

    la fonction & spl_autoload_register est appelé automatiquement par le serveur où il faut le placer quelque prat plus spécifiquement (Routeur, controleur?).

    Je bloque dessus et je ne comprends même pas pourquoi... Et ca m'énnerve d'autant plus que pour le coup je, n'arrive pas à faire autre chose car je n'arrive pas a mettre en place ce bête autoloader...
    C'est extrêmement frustrant car j'avançais plutôt correctement et je voyais la fin de la "base" j'étais en train de retravailler les classes quand on m'a suggéré l'autoloader, et plus rien ne va... je bug littéralement dessus...

    Mes classes démarrent ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    use model\services\Database;
    
    namespace model\manager;
    
    class CommentManager{
    et voilà l'arbo du projet:
  3. Avatar de rawsrc
    • |
    • permalink
    Salut,

    L'autoloader doit être chargé et déclaré au moins une fois à chaque appel.
  4. Avatar de laurentSc
    • |
    • permalink
    Bonjour,

    ayant démarré la lecture du tout nouveau billet sur le mvc (https://www.developpez.net/forums/bl...-cas-pratique/), on y parle au début de autoloader et de namespace. Ayant déjà utilisé l'autoloading mais jamais les namespaces, j'ai pensé qu'il fallait commencer par maîtriser cela. J'ai donc essayé d'adapter mon script de autoloading avec les namespaces. Mais j'ai l'erreur fatale du titre. Peux-tu me dire pourquoi ?

    index.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    use rep_classes\MaClasse1;
    use rep_classes\MaClasse2;
    //autoloading
    include_once 'Autoloader.php';
     
    Autoloader::register();
     
    $obj  = new MaClasse1();
    $obj2 = new MaClasse2();
     
    debug($obj);
    debug($obj2);
    (debug=version améliorée de var_dump)

    Autoloader.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class Autoloader {
    static function register() {
        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érifie 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);
    }
    }

    _classes/rep_classes/Ma_classe1.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    namespace rep_classes\MaClasse1;
     
    class MaClasse1 {
        public $varmaclasse1=1;
    }

  5. Avatar de laurentSc
    • |
    • permalink
    Je me réponds à moi-même :

    dans index.php : use _classes\rep_classes\MaClasse1; et dans MaClasse1.php : namespace _classes\rep_classes;