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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    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 : 59
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    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 confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Billets dans le blog
    12
    Par défaut
    Salut,

    en complément, un peu de lecture par ici

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

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    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 : 59
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    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 éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Mai 2018
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mai 2018
    Messages : 275
    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

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