4 votes

Comment fonctionnera cet autoload ?

Voici mon cours sur les chargeurs automatiques. J'apprends le PHP depuis cette semaine. J'ai eu l'idée de l'auto chargeur à partir de différents articles et du livre PHP in action, mais je n'ai aucune idée de la façon dont il fonctionnera réellement ?

class autoloader {
    public static $loader;

    public static function init()
    {
        if(self::$loader == NULL) {
            self::$loader = new self();
        }
        return self::$loader;
    }   

    public function __construct()
    {
        spl_autoload_register(array(this, 'library'));
        spl_autoload_register(array(this, 'controller'));
        spl_autoload_register(array(this, 'helper'));
        spl_autoload_register(array($this, 'model'));
    }

    public function library($class) 
    {
        set_include_path(get_include_path() . PATH_SEPARATOR . '/lib');
        spl_autoload_extensions('.php');
        spl_autoload($class);
    }

    public function controller($class)
    {
        set_include_path(get_include_path() . PATH_SEPARATOR . '/controller');
        spl_autoload_extensions('.php');
        spl_autoload($class);
    }

    public function helper($class)
    {
        set_include_path(get_include_path() . PATH_SEPARATOR . '/helper');
        spl_autoload_extensions('.php');
        spl_autoload($class);
    }

    public function model($class)
    {
        set_include_path(get_include_path() . PATH_SEPARATOR . '/model');
        spl_autoload_extensions('.php');
        spl_autoload($class);
    }
}

Je voudrais demander comment fonctionne exactement cet autoloader ? Par exemple, si j'instancie une classe qui se trouve dans le dossier Lobrary, comment le fichier complet sera-t-il traité ? comment ce fichier complet sera-t-il traité ?

3voto

Vitaliy Lebedev Points 181

Tout d'abord, lorsque vous instanciez une classe, sa fonction de constructeur enregistre quatre fonctions qui gèrent l'auto-chargement de la classe.

$autoloader = new autoloader();

Chacun d'entre eux recherchera les fichiers dans son propre répertoire spécifique. Il n'est pas nécessaire d'appeler la fonction autoloader::init(), car toutes les fonctions autoload sont déjà enregistrées lors de l'instanciation de la classe.

Ensuite, lorsque vous essayez d'instancier une classe, si PHP ne la trouve pas, avant d'échouer avec une erreur, il exécutera les fonctions, enregistrées par spl_autoload_register() dans l'ordre où elles ont été enregistrées. (autoloader::library(), autoloader::controller(), autoloader::helper() et autoloader::model()), et, si après cette classe sera disponible, elle sera instanciée.

En élargissant votre exemple, voici un extrait de code :

<?php
include 'autoloader.php'; // in this file we have our autoloader class

$autoloader = new autoloader();

$libClass = new someLib();

Lorsque nous appelons new someLib(), le mécanisme de chargement automatique de PHP va chercher le fichier 'somelib.php' (!lowercase !) dans tous les endroits mentionnés dans la directive include_path. Vous voyez, chaque fonction ajoute son propre emplacement à cette directive

set_include_path(get_include_path() . PATH_SEPARATOR . '/controller');

Cela signifie que le dossier nommé 'controller', qui est situé dans votre répertoire racine, sera ajouté à include_path, et spl_autoload() y cherchera un fichier. Donc vous devez créer le fichier /lib/somelib.php et avoir une classe avec le nom 'someLib'.

J'espère que cela vous aidera

Lecture supplémentaire : spl_autoload_register spl_autoload

1voto

Rajan Rawal Points 1569

@user991047 En tant que débutant, je vous conseille d'éclaircir le concept de la classe et les concepts basés sur la POO. Si vous connaissez déjà, ignorez le conseil.

La classe que vous avez mentionnée est principalement utilisée dans le cadre MVC (Model View-helper Controller) basé sur PHP. Le cadre est l'ensemble des classes basées sur php pour Model, Helper et Controller qui aident à accélérer le développement de l'application, la sécurité, la facilité d'utilisation du code et bien d'autres choses encore...

Pour les applications qui utilisent le framework MVC de PHP, il faut définir le chemin de la bibliothèque de ces classes afin que l'utilisateur puisse développer son propre code sans se soucier du chemin de la bibliothèque MVC. Et c'est l'objectif de cette classe

La classe d'autoloader que vous avez mentionnée contient une méthode

public static function init()

Cette méthode est un état, vous pouvez l'appeler directement en instanciant l'objet de classe autoloader. Cette méthode vérifie si l'objet de la classe autoloader est instancié ? et si ce n'est pas le cas, elle crée l'objet de la même classe par lequel on peut accéder aux méthodes de la classe.

Le constructeur est automatiquement appelé lorsque l'objet de la classe est créé et il enregistrera les quatre méthodes.

public function library($class) 
public function controller($class) 
public function helper($class) 
public function model($class) 

Ces fonctions permettent d'exécuter include_once() automatiquement pour toutes les classes MVC.

Si vous ne comprenez pas encore, soyez d'abord clair sur le modèle MVC :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X