Question

Dans mon include_path sur le côté serveur que j'ai une référence à un répertoire de poire, dans / usr / share / pear /. Au sein de mes applications j'inclure des fichiers d'une bibliothèque commune, vivant dans / usr / share / pear / bibliothèque / 'avec require_once 'library/file.php'.

J'ai récemment commencé à utiliser le chargeur automatique spl, j'ai remarqué dans la fonction du chargeur, vous devez déterminer la logique avec laquelle d'inclure le fichier. Ma première façon de le faire était d'essayer d'inclure un fichier et le supprimer avec @ pour voir si elle échouait, par exemple @include 'library/file.php' mais je pense que la plupart du temps parce que je lis beaucoup de choses sur @ étant une mauvaise pratique, j'ai décidé de le faire manuellement moi-même le travail en faisant exploser get_include_path par le PATH_SEPARATOR et de voir si le répertoire est ce que je veux que ce soit, puis en faisant un file_exists et incluant .

comme ceci:

function classLoader( $class ) {
    $paths = explode( PATH_SEPARATOR, get_include_path() );
    $file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
    if ( file_exists( $file) == false ) 
    {
        $exists = false;
        foreach ( $paths as $path ) 
        {
            $tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
            if ( file_exists ( $tmp ) ) 
            {
            $exists = true;
            $file = $tmp;
            }
        }
        if ( !$exists ) { return false; }
    }
    include $file;
}

spl_autoload_register('classLoader');

Est-ce que je vais la mauvaise route? Dois-je viens de faire l'entreprise @include ou je le fais un peu dans la bonne direction?

Était-ce utile?

La solution

Une chose que le projet Habari autoloader fait cela est intéressant cache la liste complète des fichiers de classe dans la mémoire pour que ce soit ne pas faire des recherches de disque pour les fichiers chaque fois qu'une classe est demandée.

Pour l'essentiel, vous déclarez statique dans votre __autoload() qui contient un tableau de tous les fichiers de classe, indexé par la classe qui les fera charger. Par exemple, le code utiliserait Dir ou glob() pour générer ce tableau statique:

$class_files = array(
  'user' => '/var/www/htdocs/system/classes/user.class.php',
);

Ensuite, vous suffit d'inclure $class_files[$class] pour obtenir le fichier correct. C'est agréable et rapide car il obtient le catalogue à partir du disque à la fois, au lieu de générer la liste ou la recherche d'un nom de fichier spécifique à chaque fois qu'une nouvelle classe est référencée. (Vous seriez surpris de voir à quel point une différence de vitesse qu'il fait.)

Si le nom de classe est pas une clé dans le tableau, vous pouvez lancer une exception personnalisée ou de générer un talon / classe fantaisie de revenir. En outre, si vous consultez le chargeur automatique du système Habari, vous verrez que Habari implémente __static() dans les classes qui sont chargées automatiquement, qui est comme un constructeur pour les classes statiques.

include_once() est à éviter, et l'opérateur @ est inutile si vous avez vérifié le fichier à inclure.

Autres conseils

Je vais personnellement le chemin en utilisant

function autoload($class) {
    /* transform class name into filename ... */
    include $class;
}

même sans le @ pour faciliter le débogage (erreurs sont à l'arrêt / connecté production)

Vous pourriez également être intéressé par la discussion à ce sujet sur la liste des développeurs PHP: http: / /marc.info/?t=125787162200003&r=1&w=2

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top