IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Chargement automatique récursif dans les répertoires [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Par défaut Chargement automatique récursif dans les répertoires
    Bonsoir, je cherche à faire une classe ou fonction pour le chargement de toutes mes classes.
    Pour ce faire une méthode de type récursive serai vraiment une bonne idée car pour l'instant le coté pratique n'y est pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    unction autoLoader($className){
    	//Directories added here must be
    	//relative to the script going to use this file.
    	//New entries can be added to this list
    	$directories = array(
    	dirname(__FILE__).'/admin/db/',
    	dirname(__FILE__).'/frontend/db/',
    	dirname(__FILE__).'/frontend/controller/'
    	);
     
    	//Add your file naming formats here
    	$fileNameFormats = array(
          '%s.php',
          '%s.class.php',
          'class.%s.php',
          '%s.inc.php'
          );
     
          // this is to take care of the PEAR style of naming classes
          $path = str_ireplace('_', '/', $className);
          if(@include_once $path.'.php'){
          	return;
          }
     
          foreach($directories as $directory){
          	foreach($fileNameFormats as $fileNameFormat){
          		$path = $directory.sprintf($fileNameFormat, $className);
          		if(file_exists($path)){
          			include_once $path;
          			return;
          		}
          	}
          }
    }
    spl_autoload_register('autoLoader');
    J'ai penser utiliser RecursiveIteratorIterator ou autre chose je cherche en bref quelque chose de rapide et surtout de pratique.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Par défaut
    Bonjour,


    Pas besoin d'utiliser RecursiveIteratorIterator. Par contre, je ne comprend pas l'idée de "type" récursif...

    Normalement, c'est "récursif" de base. C'est à dire, si tu cherches à appeler une classe qui n'est pas déclarée, alors, grâce à ton autoload, tu vas pouvoir la charger dans faire d'include auparavant. Si dans la classe que tu appelles, il y a une classe qui est utilisé et qui n'est pas déclarée ,alors, .... Enfin, récursif...

    Mais ton système me semble étrange. Avec ce que tu as, tu risques d'appeler parfois des classe ayant le même nom (ou presque).

    Le nom de tes fichiers devrait aussi être uniformisé.


    Cordialement,
    Patouche

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Par défaut
    Mais ton système me semble étrange. Avec ce que tu as, tu risques d'appeler parfois des classe ayant le même nom (ou presque).

    Le nom de tes fichiers devrait aussi être uniformisé.
    Comment pour pour pallier à ce petit problème, je souhaite vraiment être organisé de manière strict mis à part nommé les fichiers intelligement.

    Quand je disais de type "récursif", je voulais dire que dans ma fonction je déclare un tableau contenant les dossiers "à scanner".
    Seulement, il ne prend que les fichiers contenu dans ce même dossier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $directories = array(
    	dirname(__FILE__).'/admin/db/',
    	dirname(__FILE__).'/frontend/db/',
    	dirname(__FILE__).'/frontend/controller/'
    	);
    Si je place des fichiers dans /frontend/controller/, ils sont automatiquement inclus mais si je créer un dossier "home" dans /frontend/controller/ et que j'y place des fichiers il ne sont alors pas pris en compte.
    Je dois pouvoir récupérer tous les fichiers du dossier "controller" même s'il contient des sous-dossiers

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Salut,

    Tu peux faire
    ton propre scanner de fichier à coup de recursiveiterator, d'opendir et autres scandir
    ou utiliser glob

    Mais quelques soit ta méthode. Par rapport à ton implémentation actuelle, tu peux faire deux choses, pour la rapidité.
    - Ne scanner qu'une et une fois tes dossiers par execution.
    Les dossiers que tu références et découvrent sont statique à ton application.
    Ils ne vont pas changer d'état en cours d'execution, normalement.
    - Mettre ce résultat en cache. memcache, apc, fichier. Peu importe, mais une fois en prod, ton site changera rarement d'arbo de classe, c'est donc très efficace.

    Dernière chose, lorsque tu mets en cache ton résultat, il ne s'invalide que lorsque la recherche d'une classe dans ce set à échoué, tu peux donc lui donner un lifetime infini, puisqu'ici il à une validation logique. C'est donc tout à fait utilisable en en environnement de dev, sans probleme.

    Comment pour pour pallier à ce petit problème, je souhaite vraiment être organisé de manière strict mis à part nommé les fichiers intelligement.
    perso, je ne vois pas trop de solution sans les ns.
    ZF à tenter un truc, mais bon. J'ai du y mettre les mains, je ne suis pas tout à fait certain du systeme sur de plus large applications. Mais il n'y à pas non plus de vrai solution, car jusqu'à php5.3 le nom d'une classe devait être unique...


    a plus

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 044
    Par défaut
    merci pour les précisions, je souhaite alors utiliser RecursiveDirectoryIterator qui semble adapté pour scanner un dossier.
    J'ai défini plusieurs chose :
    1. Scanner les dossiers parent défini
    2. Pouvoir définir l'ordre du scanne en question (ordre des parents)
    3. scanner dans ses même dossiers tous les fichiers
    4. scanner également tous les dossiers des dossiers parents
    5. inclure uniquement les fichiers de type : class.%.php et interface.%.php (le reste est exclus)
    6. mettre en cache le résultat pour les ressources

    Pour RecursiveDirectoryIterator je vois plus ou moins le truc, je n'ai pas encore eu l'occasion de la tester.
    un bon exemple extrait de la doc défini un scanne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ite=new RecursiveDirectoryIterator("/path/");
     
    $bytestotal=0;
    $nbfiles=0;
    foreach (new RecursiveIteratorIterator($ite) as $filename=>$cur) {
        $filesize=$cur->getSize();
        $bytestotal+=$filesize;
        $nbfiles++;
        echo "$filename => $filesize\n";
    }
     
    $bytestotal=number_format($bytestotal);
    echo "Total: $nbfiles files, $bytestotal bytes\n";
    Je suppose que pour définir un mode récursif (scanne les dossiers enfants de chaque parents) il faut définir une deuxième boucle.
    MAis une chose est pour le moins obscure comment se sert on de la fonction "next" et getChildren ?
    Autre chose que me recommandez-vous pour la mise en cache du résultat
    merci

  6. #6
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    @gtraxx

    A la base, je trouve que ton autoLoader est mauvais. Le prob principale a été évoqué: risque de charger non pas plusieurs fois la même classe (car y a des inlude_once), mais plutôt de charger une mauvaise classe.

    Aussi, les boucles, les accès et tests de fichiers etc, ça amène à une implémentation qui est un gouffre en terme de performance par rapport à de simples require_once en début de fichiers.

    Pour que ce soit gérable, il faut une convention de nommage très stricte (du genre Zend_Sub_Sub2_Class) et sinon les namespaces de php 5.3 pour permettre un mapping le plus direct possible entre le nom complet de la classe et sa localisation dans le système de fichiers. Comme ça on élimine les risques de charger une mauvaise classe et on élimine surtout toute la machinerie pour "trouver" le fichier. Aussi, il ne faut pas hésiter à créer plusieurs fonctions d'autoloading registrées avec spl_autoload_register. Chaque func est spécialisée pour ses fichiers à elle. Il vaut mieux laisser spl_autoload boucler sur les fonctions plutôt que de boucler manuellement sur des répertoires et/ou des arrays de locations etc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 25/04/2013, 18h51
  2. Ménage dans les répertoires
    Par lavm01 dans le forum Langage
    Réponses: 1
    Dernier message: 09/01/2008, 17h04
  3. Questions sur la navigation dans les répertoires
    Par belle5656 dans le forum Langage
    Réponses: 86
    Dernier message: 03/11/2007, 20h44
  4. Réponses: 4
    Dernier message: 20/12/2006, 10h26
  5. naviguer dans les répertoires du serveur
    Par guitz dans le forum Langage
    Réponses: 2
    Dernier message: 02/09/2006, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo