php
  • autoload
  • glob
  • spl-autoload-register
  • 2010-11-20 43 views 0 likes 
    0

    J'utilise un autoloader pour inclure des classes. Ce que je fais en ce moment utilise "glob" pour lire différents dir et les pousser dans un tableau. Y a-t-il une meilleure solution à cela?Lazy Classes Comprend PHP

    $path = './'; 
    
    $files = array_merge(
    glob($path.'includes/classes/system/*.class.php'), 
    glob($path.'includes/classes/system/baseclasses/*.class.php'), 
    glob($path.'includes/classes/system/systementities/*.class.php')); 
    

    EDIT:

    J'utilise cette classe dans une autoload. Le problème est que je dois rechercher les fichiers avec glob. Y a-t-il un moyen plus rapide de faire cela?

    Répondre

    1

    Le chargement automatique sera déclenché chaque fois que vous essayez d'utiliser une classe inconnue de PHP. Si vous utilisez include/require, PHP passera par tous les répertoires que vous avez spécifiés pour votre include_path dans PHP.ini, donc il n'y a aucune raison d'utiliser glob. Dans votre cas, il devrait être suffisant pour régler le include_path à

    /path/to/includes/classes/system/ 
    

    Le le plus rapide moyen d'inclure des fichiers serait d'utiliser un class2file map. Cependant, cela vous oblige à créer une telle carte et à la maintenir à jour lorsque vous modifiez votre application.

    +0

    Mais ici j'ai aussi besoin des fichiers. Donc le code ci-dessus n'est pas changé. J'utilise déjà spl_autoload_register (comme le révèlent les balises) – Simon

    +0

    Que voulez-vous dire "J'ai besoin des fichiers"? Si vous avez besoin d'une carte parce que vous pensez que la recherche sur include_path est lente, pensez à générer la carte en utilisant n'importe quelle stratégie, et en la mettant en cache quelque part (fichier simple, APC, memcache). – timdev

    +0

    Sonne mieux, je vais essayer! – Simon

    1

    PHP a déjà résolu ce problème pour vous. Utilisez PHP built-in autoloader. Ne lancez jamais le vôtre lorsque le langage/le cadre vous le permet.

    0
    function __autoload($class) { 
        $classfile = $class.'.class.php'; 
        $path = './includes/classes/system/'; 
        if (is_file($path.$classfile)) require_once($path.$classfile); 
        if (is_file($path.'baseclasses/'.$classfile)) require_once($path.'baseclasses/'.$classfile); 
        if (is_file($path.'systementities/'.$classfile)) require_once($path.'systementities/'.$classfile); 
    } 
    

    ... ce qui n'est toujours pas le meilleur moyen, mais cela vous permet d'utiliser glob(). Si vous chargez généralement tous vos systèmes, il devrait y avoir une liste require() codée en dur dans un script boot/config. Il y a beaucoup d'options sur la façon d'organiser et de récupérer les fichiers de classe. Pour réduire le temps de recherche de scripts, vous pouvez considérer votre fichier comme une interface. Par souci de simplicité, vous pouvez placer toutes les classes non obligatoires dans le même dossier, réduisant les appels is_file() à un.

    Dans mon système, j'ai des classes d'objets regroupées dans des dossiers avec leurs scripts et vues de contrôle respectifs. Ma fonction __autoload() a un travail plus simple -

    $classfile = $path.$class.'/'.$class.'_class.php'; 
    if (is_file($classfile)) require_once($classfile); 
    
    +0

    J'utilise une classe singleton où je stocke les fichiers, donc je dois seulement faire une vérification isset au lieu du contrôle is_file – Simon

     Questions connexes

    • Aucun problème connexe^_^