Bonjour à tous,

J'ai commencé à suivre la formation en POO de grafikart et je bloque sur un chapitre qui me semble essentiel pour avancer dans la POO, il s'agit de l'autoloading.

Premièrement la fonction __Autoload() :

function __autoload($class_name){
    require('class/' . $class_name . '.php'); 
}

Si j'ai bien compris cette fonction, elle s'occupe de charger toutes les class présentes dans notre dossier "class/" pour qu'on n'ait plus à toutes les charger manuellement avec un require. C'est un peu une sorte de foreach donc?

Je pense que jusque là tout va bien mais c'est ensuite que ça se corce. Grafikart comme php.net nous dit bien de ne plus utiliser autoload
car on ne peut pas avoir plusieurs fois la même fonction et donc on ne peut pas créer plusieurs autoloader.

Pourriez vous me donner un cas concret ou cela pose problème car je ne comprends pas vraiment le problème..

Je ne comprends pas pourquoi on utilise la méthode autoload() dans le deuxième exemple. Car c'est une fonction que l'on crée et je ne vois pas ce que prend comme valeur la propriété "$class"..
On passe ensuite par spl_autoload_register() et je ne vois pas du tout ce que fait cette fonction non plus..

J'ai déjà été voir la doc sur php.net mais ça ne m'aide pas plus à comprendre..

class Autoloader{

    /**
     * Enregistre notre autoloader
     */
    static function register(){
        spl_autoload_register(array(__CLASS__, 'autoload'));
    }

    /**
     * Inclue le fichier correspondant à notre classe
     * @param $class string Le nom de la classe à charger
     */
    static function autoload($class){
        require 'class/' . $class . '.php';
    }

}

Merci d'avance pour vos réponses :)

4 réponses


Le_Futuriste
Réponse acceptée

Salut,

Je t'explique le fonctionnement de la classe engros (ce que je comprend)

static function register(){
        spl_autoload_register(array(__CLASS__, 'autoload'));
    }

Cette fonction permet :

  1. Elle récupère sous la forme d'un tableau les différantes classe appelé dans le script
  2. Elle appele l'autre fonction autoload() le nombre de fois qu'il y a de classe dans le script en passant en paramètre le nom de la classe à inclure.
static function autoload($class){
        require 'class/' . $class . '.php';
    }

Cette fonction require la classe qui est passé en paramètre, dans le dossier class.

Voila ce que j'y pense.

quenti77
Réponse acceptée

En gros la méthode autoload qu'il a écrit dans la classe est une méthode perso.

La fonction __autoload ne peut pas être appeler plusieurs fois pendant toute l'exécution du script php donc si je fais un code qui l'utilise et que une bibliothèque par exemple swiftmailer l'utilise aussi on aura une erreur.

Avec la fonction spl_autoload_register on peut enregistrer autant de fonction que l'on veut. En fait c'est comme si on faisait ceci :

<?php

class Autoloader {
    public static function registerAutoload() {
        // [...] c'est comme array(...)
        spl_autoload_register([__CLASS__, 'autoloadApp']);
        spl_autoload_register([__CLASS__, 'autoloadSrc']);
    }

    public static function autoloadApp($className) {
        require 'app/'.$className.'.php';
    }

    public static function autoloadSrc($className) {
        require 'src/'.$className.'.php';
    }
}

Autoloader::registerAutoload();

Et quand une classe inconnue arrive comme par exemple la classe Personnage cela va se faire ainsi :

<?php

// Dans php il y a une liste des fonctions
// à appeler si la classe n'est pas connu
$findFunctions = [
    [__CLASS__, 'autoloadApp'],
    [__CLASS__, 'autoloadSrc']
];

// Il peut donc appeler les différentes fonctions
// jusqu'a ce que la classe soit chargé et sinon
// il émet une erreur.
foreach($findFunctions as $f) {
    // Permet d'appeler une méthode
    call_user_func($f[0].'::'.$f[1], 'Personnage');
}

Donc maintenant si j'ai ma bibliothèque qui a besoin d'un autoload et que swiftmailer en a aussi besoin, alors on peut quand même les faires il y a pas de soucis.

Alors après je ne sais pas trop comment ça marche en interne mais c'est pour le principe surtout.

Merci beaucoup les gars, c'est beaucoup plus clair et je comprends ce que je fais maintenant :)

Bonne journée et encore merci à vous :)

Salut,

Pense à passer ton sujet à résolu, merci.