IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

explication de la fonction spl_autoload_register()


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut explication de la fonction spl_autoload_register()
    Bonjour

    Je cherche a comprendre le fonctionnement de spl_autoload_register()

    La fonction spl_autoload_register() enregistre une fonction de notre choix dans la pile d'autoload. Cette pile est destinée à enregistrer des fonctions et les appeler, d'une manière implicite, quand on en aura besoin. De cette manière, si on fait appel à une classe (instanciation, héritage ou appel statique d'un membre) l'autoload se charge d'appeler la fonction qui permet d'inclure la classe souhaitée.

    Faut-il passer toutes les class dans spl_autoload_register()

    L'idée serait de ne charger que les class utilisée et non pas toutes les class (qui ne servent à rien)

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Si tu te contentes de ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function charge_chien(){
       include 'classes/animal.class.php';
       include 'classes/chien.class.php';
    }
    spl_autoload_register('charge_chien');
    $chien=new Chien('Médor');//fonctionnera
    Ca fonctionnera, mais ça implique que tu saisisses tout à la main.
    Et du coup, tu ne verras pas trop la différence avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    include 'classes/animal.class.php'; 
    include 'classes/chien.class.php';
    $chien=new Chien('Médor');//fonctionnera
    En dehors du fait que dans ce dernier code, tes include se chargent d'emblée, dans le précédent, tes include ne se chargent qu'à la construction de l'objet, ça te fait un peu une belle jambe...

    Là où spl_autoload_register devient rentable, c'est surtout allié à une fonction anonyme comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //En utilisant une fonction anonyme à partir de PHP 5.3.0
    spl_autoload_register(function ($class) {
        include 'classes/' . $class . '.class.php';
    });
    Tu ranges toutes tes classes dans un répertoire classes.
    Mettons chien.class.php, chat.class.php, animal.class.php, rose.class.php, vegetal.class.php etc...

    Le code ci-dessus te sera bien utile, car il signifie, ne va chercher l'include que si j'instancie la classe, ou une classe mère par héritage etc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //En utilisant une fonction anonyme à partir de PHP 5.3.0
    spl_autoload_register(function ($class) {
        include 'classes/' . $class . '.class.php';
    });
    $chien=new Chien('Médor');
    déclenchera l'include de animal.class.php puis celui de chien.class.php et seulement ces deux-là, pas plus pas moins, et dans le bon ordre !
    et avec le même préambule, $rose=new Rose(); déclenchera l'include de vegetal.class.php, puis celui de rose.class.php, et seulement ces deux-là, pas plus pas moins et dans le bon ordre !

    Donc à la question
    Faut-il passer toutes les class dans spl_auoload_register()
    ben non, justement. Il ne faut passer les include de façon dynamique que quand on en a besoin, fonction anonyme, c'est à ça que ça sert.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    en complément, un peu de lecture par ici

  4. #4
    Membre régulier
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut
    Ok super ,merci

    C'est quoi l'avantage de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    spl_autoload_register(function ($class) {
        include 'classes/' . $class . '.class.php';
    });

    par rapport a :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function __autoload(function ($class) {
        include 'classes/' . $class . '.class.php';
    });

  5. #5
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    J'ai trouvé ça sur cette page
    http://php.net/manual/fr/function.autoload.php

    Donc tout dépend de ta version de PHP.

    In PHP 7.2, this code will trigger a "
    Deprecated: __autoload() is deprecated, use spl_autoload_register() instead in path\to\file.php on line *" error although the spl_autoload_register function really really exists.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
        if(!function_exists('spl_autoload_register')){
            function __autoload($class){
                // blah blah blah
            }
        }
    ?>
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  6. #6
    Membre régulier
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut
    merci

    une petite pour la route lol

    c'est simple quand j'ai toutes mes classes dans le même dossier

    mais si j'ai
    Dossier A : 3 fichiers (class1.php, class2.php, class3.php)
    Dossier B : 2 fichiers (class1.php, class2.php)
    Dossier C : 2 fichiers (class1.php, class2.php)

    J'ai bien compris qu'il ne faut qu'une class par fichier pour que cela marche avec la fonction anonyme

    Mais quand on commence à structurer avec des dossiers, c'est quoi la piste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    spl_autoload_register(function ($class) {
        include 'classes/' . $dossierclass . '/' . $class . '.class.php';
    });
    Si possible sans les namespaces... car je n'utilise pas des codes externes ET surtout personne ne voudra utiliser mon code LOL

  7. #7
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    spl_autoload_register(function ($class) {
        include 'classes/dossier_a/' . $class . '.class.php';
        include 'classes/dossier_b/' . $class . '.class.php';
        include 'classes/dossier_c/' . $class . '.class.php';
    });
    L'idée, c'est que si tu n'instancies pas dans le script qui suit... une classe du dossier C mettons, eh bien tu n'auras aucun include du dossier C.
    Ca fonctionnera.

    edit : argh ? Tes classes vont s'appeler pareil dans 2 dossiers différents ? Ca change tout si c'est le cas...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  8. #8
    Membre régulier
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut
    Si j'ai CLASS masuperclasse.class.php dans le dossier C

    Je vais faire 2 includes (A et B) dans le vide ????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    spl_autoload_register(function ($class) {
        include 'classes/dossier_a/' . $class . '.class.php';
        include 'classes/dossier_b/' . $class . '.class.php';
        include 'classes/dossier_c/' . $class . '.class.php';
    });
    C'est pas top ca, si ?

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    relis bien mon message.
    Le but de la manœuvre c'est de ne plus avoir à gérer manuellement les inclusions et de laisser le moteur se débrouiller tout seul pour inclure ce qui est nécessaire au programme, donc pour y parvenir simplement il faut déjà éviter de mettre toutes les classes sur l'espace de nom global (c'est-à-dire sans aucun espace de nom) et les classer selon une arborescence logique. Cela permettra de dire au moteur où aller chercher les fichiers.
    En gros, il faut pouvoir transformer l'arborescence des espaces de nom en arborescence de répertoires. Reprends mon post et dis-moi ce qui n'est pas clair.

  10. #10
    Membre régulier
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut
    Pour le moment je me perd un peu dans les namspace

    du coup je vais le faire à l'ancienne -> organisation Dossier -> nomdossier_nomclasse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       static function register(){
            spl_autoload_register(array(__CLASS__, 'autoload'));
        }
     
        static function autoload($class){
    		$folder=explode("_", $class);
                require ROOT . '/' . strtolower($folder[0]) . '/' . $class . '.php';
            }
        }

  11. #11
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Mais raw, moi ça va me servir, les namespaces, je connaissais, je voyais l'intérêt, mais je ne me lançais pas. Ton topo me fait un déclic.

    @scamphp
    Je vais faire 2 includes (A et B) dans le vide ????
    Il y a un truc que tu ne piges pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    spl_autoload_register(function ($class) {
    Peut se traduire par Si et seulement si tu convoques une classe... Donc pas d'include pour rien.
    Par contre je te le redis, avec un tel système, tu n'as pas le droit de nommer une classe pareil dans 2 répertoires différents. Tu ne m'as pas répondu là dessus, sur ton existant.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  12. #12
    Membre régulier
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    Points : 98
    Points
    98
    Par défaut
    Bonjour

    Non les noms de mes class sont différentes

    Pour gérer plusieurs dossiers tu fais 3 includes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    spl_autoload_register(function ($class) {
        include 'classes/dossier_a/' . $class . '.class.php';
        include 'classes/dossier_b/' . $class . '.class.php';
        include 'classes/dossier_c/' . $class . '.class.php';
    });
    OK si la class => Machin est instancié il va charger (si et seulement si)
    mais pour parcourir les différents dossiers (a b et c) tu fais 3 includes
    si ma class est dans C, le script va bien lancer en 1er l'include dans A, puis l'include dans B et enfin dans C
    ou alors il faut tester avant si le fichier existe dans A, puis dans B, puis dans C
    Si je rajoute un dossier il ne faut pas oublier de modifier l'autoload

    C'est pour cela que je suis passé sur un script plus automatique mais qui impose de nommer les class de type NomDossier_NomClass
    pour reconstituer le chemin... bon en gros j'ai l'impression que je viens d'inventer le NAMESPACE du débutant lol

    Je pense effectivement que le NAMESPACE est plus pratique pour les projets collaboratifs

    que je récupèrè : NomDossier_NomClass.php => pour obtenir => NomDossier / NomDossier_NomClass.php

    ou

    que je récupère : NAMESPACE : NomDossier\NomClass => pour obtenir => NomDossier / NomClass.php

    J'ai l'impression que c'est la même chose


    Après en cas de changement de nom de dossier Class... je en sais pas si une version est plus rapide que l'autre entre modifier tous les NAMESPACE ou renommer les fichier

    Par contre dans tous les cas un changement de nom de class impose de modifier dans le code dans les 2 méthodes


    Mais comme je suis débutant je demande votre avis...


    J'utilise la forum comme un lieu d'échange pour connaitre différents points de vues plus que pour avoir des réponses toutes faites (apprendre seul c'est bien mais pouvoir discuter et échanger c'est mieux)

  13. #13
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Ah oui, pardon... tu as raison, c'est moi qui me gourais... Si tu instancies une classe d'un dossier, Il fait 3 include pour le prix d'1 (2 plantent d'ailleurs)... tu as raison. Ce code du manuel ne fonctionne que si on a un et un seul répertoire de classes.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  14. #14
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bon on va reprendre.

    un autoloader ne doit s'occuper que d'inclure un seul et unique fichier. Vous ne mettez jamais plusieurs include dedans, c'est une hérésie.
    D'ailleurs, il est tout à fait possible de déclarer autant d'autoloader qui vous plaira, ces dernier seront appelés par le moteur PHP dans l'ordre de leur déclaration jusqu'à ce qu'il y en ait un qui renvoie true.
    Tant que les fonctions d'autoloader renvoient false, la main passe à l'autoloader suivant et ainsi de suite jusqu'à l'épuisement de la pile d'autoloader et sans solution PHP plantera avec une magnifique erreur fatale.

    Comme le risque est grand que le fichier recherché ne soit pas trouvé, il est obligatoire de tester son existence avant de faire include.
    Ce que mon petit bout de code fait avec l'explication qui va bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        // 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;
        }
    Vous pouvez tout à fait nommer les classes comme bon vous semble du moment qu'à partir du nom pleinement qualifié de la classe, vous êtes en mesure d'en extraire un chemin vers le fichier source. Liberté totale. A vous de voir si vous allez jeter ou pas les bonnes pratiques...

    Généralement, avoir plusieurs autoloader se limite au cas où vous faites appel à des outils externes à votre code. Ces derniers sont souvent autonomes et enregistrent auprès du core PHP la manière de trouver correctement leurs fichiers sources.

Discussions similaires

  1. [Système] Explications sur la fonction header()
    Par QuenTinO dans le forum Langage
    Réponses: 1
    Dernier message: 28/08/2007, 09h45
  2. {VBA Excel} demande d'explication sur la fonction ClearContents
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/06/2007, 15h24
  3. explication sur le fonction Sum dans qreport
    Par youcef_b_dz dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/05/2007, 13h04
  4. [filter2] Demande d'explication sur cette fonction
    Par ranell dans le forum Images
    Réponses: 3
    Dernier message: 10/05/2007, 09h19
  5. [Fonction]Explication sur la fonction EXPLODE de php
    Par daudet dans le forum Langage
    Réponses: 6
    Dernier message: 13/04/2006, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo