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 :

Utilisation de spl_autoload_register [PHP 5.3]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut Utilisation de spl_autoload_register
    Bonjour,

    Je ne suis pas sûr d'avoir bien compris ici :
    http://g-rossolini.developpez.com/tu...epts#LVI-A-2-b

    Puis-je résumé pour faire simple :
    "Lorsque l'on a plusieurs autoloads dans un même code,
    on est obligé de mettre ces spl_autoload_register."

    Je ne comprends pas non plus pourquoi il a mis
    $object = new My_Special_Class();
    avant les autoloads.

    Habituellement, il me semble que l'on encode la création
    des objets après l'appel des classes.

    NB : Enlevez les commentaires pour savoir ce qu'il se passe pendant l'exécution du script.

    Code : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php
    spl_autoload_register('basic_autoload');
    spl_autoload_register('dotted_autoload');
    spl_autoload_register('pear_autoload');
     
    $object = new My_Special_Class();
     
    function basic_autoload($class)
    {
        $file = $class.'.php';
        if(file_exists($file))
        {
            require_once $file;
        }
        //echo $file.'<br/>';
    }
     
    function dotted_autoload($class)
    {
        $file = str_replace('_', '.', $class).'.php';
        if(file_exists($file))
        {
            require_once $file;
        }
        //echo $file.'<br/>';
    }
     
    function pear_autoload($class)
    {
        $file = str_replace('_', '/', $class).'.php';
        if(file_exists($file))
        {
            require_once $file;
        }
        //echo $file.'<br/>';
    }

  2. #2
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Citation Envoyé par éric1 Voir le message
    Puis-je résumé pour faire simple :
    "Lorsque l'on a plusieurs autoloads dans un même code,
    on est obligé de mettre ces spl_autoload_register."
    C'est vallable pour __autoload() mais également pour n'importe quelle autre fonctions (ou classes) : on ne peut pas définir plusieurs fois des fonctions qui ont le même nom (en considérant le nom complet avec namespaces si besoins)

    On passe donc par spl_autoload_register() pour enregistrer différentes fonctions qui font office d'autoload et qui ont donc forcément des noms différents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $object = new My_Special_Class();
    L'ordre n'a pas d'importance dans php (une fonction peut être définie après son appel, du moment que php sache où la trouver)
    Donc là php rencontre My_Special_Class. Cette classe n'existe pas, il va donc déclancher la séries d'autoload disponibles auprès de spl_autoload. Il faut donc biensûr avoir appelé spl_autoload_register('custom_autoload') plusieurs fois si nécessaire avant que php ne rencontre $object = new My_Special_Class(). C'est ce que fait ton code

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Si je comprends bien :

    Lorsque mon code rencontre
    $object = new My_Special_Class();
    parce qu'il ne trouve pas la classe,
    il cherche les spl_autoload_register.

    Un spl_autoload_register
    renvoie vers telle fonction ( par ex. basic_autoload)
    afin de charger le fichier (s'il existe).

    Dis-moi si je me trompe.

  4. #4
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Oui c'est ça en gros.

    Ce qu'il se passe exactement est ceci:

    php rencontre new My_Special_Class
    Si My_Special_Class est déjà connue (genre définie dans le script ou dans des fichiers préallablement inclus), alors y a pas de problème, ça roule.

    Là php ne trouve pas My_Special_Class.
    php est aussi en mesure de savoir si l'utilisateur à définie une fonction __autoload() quelque part. Si elle est définie, php appelle "de lui même" cette fonction __autoload.

    L'autre possibilité c'est que l'utilisateur à appelé lui même (comme dans ton exemple) spl_autoload_register().
    Dans ce cas, cette fonction désactive le comportement normal de php qui consiste à regarder dans __autoload en dernier recours.
    La classe n'est pas trouvée et c'est donc spl_autoload qui va prendre la main et appeler "elle même" les fonctions enregistrées au préallable par l'utilisateur grace à spl_autoload_register().
    A chaque fois qu'une de ces fonctions est appelée, php vérifie si la classe cherchée vient effectivement d'être chargée. Si c'est le cas, c'est bon, php reprend la main et continue le script normalement. Si ce n'est pas le cas, c'est à dire que la classe n'est pas chargée, spl_autoload continue à parcourir les fonctions autoload de l'utilisateur dans l'ordre dans lesquelles elles ont été enregistrées.
    Si au bout du compte, la classe n'a pas été chargée après avoir tout parcouru, php déclanche une erreur.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Belles précisions. Merci.

    Lorsque la 1e spl_autoload n'a pas apporté de classe,
    php passe à la 2e et s'il le faut à la 3e.
    PHP exécute toujours les instructions dans l'ordre
    où il les rencontre.

    Si les 3 spl_autoload n'ont rien apporté,
    php recherche, comme tu le dis, avec les autoload_

    Excuse si je reformule un peu les choses car cela me permet
    de mieux comprendre.

    En tout cas j'apprécie la précision de tes réponses.
    Merci.

  6. #6
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Ca n'est pas exactement ça. Il faut bien comprendre que dès qu'on utilise spl_autoload_register(), alors php ne considerera plus __autoload(). Tout passera par les fonctions qui auront été enregistrées avec spl_autoload_register().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $object = new My_Special_Class();
    Code xml : 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
    - est-ce que My_Special_Class existe ?
      - oui --> ok, tout roule
      - non
        - est-ce que spl_autoload_register() a été utilisée avant par l'utilisateur ?
          - non
            - est-ce que __autoload() existe ?
              - oui --> php appelle __autoload()
                - est-ce que la classe vient d'être chargée ?
                  - oui --> ok, tout roule
                  - non --> erreur
              - non --> erreur
          - oui  
            - php parcourt et appelle les fonctions enregistrées au préallable 
              avec spl_autoload_register()
              - est-ce que la classe vient d'être chargée ?
                - oui --> ok, tout roule
                - non --> php continue à parcourir les fonctions enregistrées
              - y a plus de fonctions a parcourir --> erreur

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utilisation multiple spl_autoload_register
    Par sidguia dans le forum Langage
    Réponses: 6
    Dernier message: 21/10/2012, 15h10
  2. [PHP 5.3] Problème avec l'utilisation de spl_autoload_register
    Par beegees dans le forum Langage
    Réponses: 2
    Dernier message: 12/08/2012, 13h38
  3. Utilisation de spl_autoload_register
    Par Benoit.RTPW dans le forum Langage
    Réponses: 2
    Dernier message: 27/07/2009, 12h23
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 13h36
  5. Réponses: 2
    Dernier message: 21/03/2002, 00h01

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