[PHP] Autoload

Résolu
Autumn`Tears Messages postés 1247 Statut Membre -  
aladin07 Messages postés 277 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'essaie de comprendre le fonctionnement d'autoload, mais sans véritable succès...
Comment l'implémenter, comment s'en servir, etc.
Si vous avez un peu de temps à partager pour m'éclairer un peu dans ce domaine, merci.



--
Cordialement,

Adrien.

2 réponses

  1. aladin07 Messages postés 277 Date d'inscription   Statut Membre Dernière intervention   30
     
    Et bien parfois on charge beacoup de classes dans un fichier php, au lieu de les inclure une à une on utilise __autoload().

    Par exemple si tu as un dossier libraries/ tu pourras inclure automatiquement toutes les classes que tu veux sans inclure manuelement les fichiers. Les fichiers seront inclus au moment ou tu appels ta classe.

    <?php 
    /* Au lieu de 
    inclue 'libraries/mailer.php'; 
    inclue 'libraries/zip.php'; 
    inclue 'libraries/themes.php'; 
     ...etc.*/ 
    
    function __autoload($name) 
    { 
        include 'libraries/'.$name.'.php'; 
    } 
    
    $mail = new Mail(); 
    $zip = new Zip(); 
    $themes = new Themes();


    Le nom du fichier qui contient la classe doit être IDENTIQUE au nom de la classe
    new MyClass va inclure MyClass.php

    Encore mieux, utiliser la fonction spl_autoload_register();

    Selons php.net __autoload() pourrait être déprecié dans le future, donc il vaut mieux s'habituer à spl_autoload_register()

    spl_autolaod_register() a le même principe que __autoload(), sauf que la première utilise un fonction déjà défini par exemple:
    <?php 
    
    /* Disons qu'on a deux dossiers qui contiennent des classes. 
    Dans le premier les libraries et dans le deuxième les models (dans un MVC) 
    
    On assume que les fichiers contenants les classes sont en minuscules 
    */ 
    
    function my_autoload($name) { 
        //Chercher dans le dossier libraries
        file_exists($file = 'libraries/'.strtolower($name).'.php') 
        // Ou dans le dossier models
        OR file_exists($file = 'models/'.strtolower($name).'.php');
        
        // Si le fichier existe dans libraries $file récupere 
        // 'libraries/'.strtolower($name).'.php' 
        // sinon elle récupere 'models/'.strtolower($name).'.php'
        include $file; 
    } 
    
    spl_autoload_register('my_autoload'); 
    
    $class = new MyClass(); 
    


    Ceci va chercher dans le dossier libraries puis dans le dossier models les fichiers en minuscule. new MyClass va include myclass.php

    Si tu as une question n'hésite pas.
    Aladin.
    1
    1. Autumn`Tears Messages postés 1247 Statut Membre 145
       
      Salut,

      Et merci pour ta réponse !

      La seule limite à ça, c'est lorsque la classe n'est pas définie par le même nom que le fichier finalement.
      0
    2. aladin07 Messages postés 277 Date d'inscription   Statut Membre Dernière intervention   30
       
      Et bien justement!

      Tu peux mettre un truc du genre:

      function my_auotoload($name)
      {
      if($name == 'Hello') include 'libraries/myclassname.php';
      else include $name.'.php';
      }

      Tu peux modifier la logique de ta fonction comme tu veux
      0
  2. A.Nonymous
     
    L'exemple de la doc est plutôt parlant, non ?
    http://php.net/autoload

    Si la définition d'une classe n'est pas connue, autoload est une solution pour permettre de charger sa définition au moment où on en a besoin.

    <?php
    function __autoload($class_name) {
    include $class_name . '.php';
    }

    $obj = new MaClasse1();
    $obj2 = new MaClasse2();
    0