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

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Classe "classmanage" pour gérer l'inclusion des fichiers de classe


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut Classe "classmanage" pour gérer l'inclusion des fichiers de classe
    Voici une petite classe simplissime pour gérer l'inclusion de vos fichiers de classes dans vos documents php. Utile pour ceux qui sont en php<5, en php 5 il y a plus simple (voir interventions ci-dessous, merci à Yogui)

    Ses avantages sont:

    -inutile de retaper tout le chemin des fichiers de classe dans chaque document ou elles sont utilisées

    -corolaire du premier: si vous changez le chemin d'un de vos fichiers de classe, inutile de le changer dans tout les documents ou elles sont utilisées

    -inutile de se préoccuper de savoir si la classe n'a pas déjà été déclarée ailleurs

    -quand une classe étends une autre classe ou utilise une occurence de cette classe, inutile de se préoccuper d'inclure la classe étendue ou celle dont on utilise une occurence, ni de l'ordre dans lequel on les inclus.

    Voici la classe classmanage:

    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
    class classmanage{
     
    var $classpath=array("utilisateur"=>"../auxil/utilisateur.php","php_data"=>"../auxil/php_data.php","postgetcookie"=>"../auxil/postgetcookie.php",
    "file"=>"../auxil/file.php","php_mysql"=>"../auxil/php_mysql.php","html_php"=>"../auxil/html_php.php");
    var $included=array();
    var $extended=array("utilisateur"=>"php_data,php_mysql,postgetcookie","php_data"=>"file","html_php"=>"postgetcookie");
    var $limit=100;
     
     
     
    function inclure($class,$i=0){
    if ($i>$this->limit) return false;
    $class=explode(",",$class);
    while ($el=each($class)){
    $a=trim($el["value"]);
    if (!isset($this->included[$a])) {
    if (isset($this->extended[$a])) $this->inclure($this->extended[$a],$i+1);
    include($this->classpath[$a]);
    $this->included[$a]=1;
    }
    }
    }
     
    }

    Mode d'emploi:

    -On ne peut créer qu'une occurrence de la classe par script (sinon on risque d'essayer d'inclure deux fois la même classe). Les utilisations de cette classe dans une fonction se feront pas une déclaration dans cette fonction de cette unique occurrence comme globale

    -Chacune de vos classes sera identifiée par un identifiant ne comportant pas le caractère virgule ",". Ici les noms sont php_data , postgetcookie, file . Vous choisissez les identifiants comme bon vous semble

    -La variable $classpath de la classe classmanage est un tableau (que vous modifierez en fonction de vos classes) sous la forme "cle"=>"valeur" , ou "cle" est l'identifiant de la classe et "valeur" est le chemin du fichier de cette classe. Si vous voulez changer ce chemin, il suffira de le faire uniquement dans le fichier de déclaration de classmanage. Par exemple ici "../classes3/file.php" est le chemin de la classe identifiée par file

    -La variable $extended de la classe classmanage est un tableau (que vous modifierez en fonction de vos classes) sous la forme "cle"=>"valeur" , ou "cle" est l'identifiant de la classe qui utilise d'autres classes (par extension ou création d'une occurence) et "valeur" est le liste des identifiants des classes utilisées, séparées par des virgules. Par exemple, ici la classe "php_data" est une extension de la classe "file" et utilise une occurrence de la classe "postgetcookie"

    -Pour utiliser la classe "classmanage", on crée une occurrence, et on appelle sa fonction inclure($a) ou son paramètre $a doit être la liste des identifiants des classes à inclure séparées par des virgules .
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $cm=new classmanage();
    $cm->inclure("php_data,file");
    Dans cet exemple, on inclus les classes php_data et file. On suppose que php_data est une extension de la classe file, mais peut importe l'ordre dans la fonction inclure (pas besoin de se préoccuper de l'ordre des inclusion, c'est un des avantages). Si php_data étends file, on peut remarquer que le code ci-dessus est équivalent à celui-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $cm->inclure("php_data");
    Car inclure php_data inclus automatiquement file.
    Le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $cm->inclure("php_data,file");
    $cm->inclure("file");
    ne posera aucun problème, la classe file ne sera inclus qu'une fois
    Le code suivant ne pose pas non plus de problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $cm->inclure("php_data");
    $cm->inclure("file");
    bien que php_data soit une extension de file


    -Le paramètre $i de include doit être toujours omis. Il sert de compteur pour limiter le nombre d'appel à des extensions successives (genre class1 extends class2, class2 extends class3, class3 extends class4, etc). c'est un garde-fou pour qui se serait trompé dans sa définition de $extended et aurait fait un truc qui se reboucle sur lui-même. Le nombre max d'extensions successives et donne par $limit, vous pouvez le modifier si vous en avez besoin de plus ( cequi serait quand même étonnant ).

    En résumé, la classe "classmanage" permet d'inclure ses classes sans se poser de question, ce que je trouve très pratique surtout quand on inclus ses classes au moment ou on en a besoin et si on en a besoin. Dans ces cas-la, inutle de se demander si ne les a pas incluses ailleurs ou si il faut inclure la classe dont elle est l'extension, on inclus et classmanage fait le reste.

    On peut s'en servir aussi pour inclure d'autres fichiers de code php que des classes, mais c'est moins intéressant.

    Et pour les petits rigolos qui poseraient la question, non, on ne peut pas inclure la classe classmanage avec la classe classmanage

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Je me permets quelques remarques avant d'aller plus loin.

    Ta classe est écrite avec PHP < 5 (dont version 3 ou 4), ce qui n'est pas idéal.

    classmanage::$classpath semble être un équivalent à la variable de configuration include_path

    Connais-tu __autoload() ? Cette petite fonction, ou spl_autoload_register() si tu dois avoir plusieurs méthodes différentes de chargement, est une alternative "officielle" à ce que tu proposes. Il n'est donc pas nécessaire de faire $classmanage->include(), on peut parfaitement rester avec des "new Class" et c'est PHP qui s'occupe d'inclure lui-même les classes correspondantes.

    Pour plus d'infos : http://g-rossolini.developpez.com/tu...ncepts#LVI-C-3

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par Yogui Voir le message
    Salut
    Ta classe est écrite avec PHP < 5 (dont version 3 ou 4), ce qui n'est pas idéal.
    Pourquoi dis-tu ca? Je travailles sous php5 et cela marche très bien...?

    Citation Envoyé par Yogui Voir le message
    classmanage::$classpath semble être un équivalent à la variable de configuration include_path
    Oui on peut dire ca... mais include_path peut-il etre modifié même quand on est en hébergement mutualisé?

    Citation Envoyé par Yogui Voir le message

    Connais-tu __autoload() ? Cette petite fonction, ou spl_autoload_register() si tu dois avoir plusieurs méthodes différentes de chargement, est une alternative "officielle" à ce que tu proposes. Il n'est donc pas nécessaire de faire $classmanage->include(), on peut parfaitement rester avec des "new Class" et c'est PHP qui s'occupe d'inclure lui-même les classes correspondantes.

    Pour plus d'infos : http://g-rossolini.developpez.com/tu...ncepts#LVI-C-3
    Ok merci pour l'info. En fait c'est surtout require_once que je ne connaissais pas. Par contre si je me trompe pas, dans le lien que tu m'as donné rien n'est prévu pour charger les classes étendues ou utilisées en tant qu'occurences dans d'autres classes...? Mais avec cette fonction require_once, c'est vrai qu'on peut faire un require_once de toute les classes étendues et appelées avant la déclaration de la classe qui les étends ou les appelle (et ce sans problème puisque require_once...porte bien son nom ).
    En ce qui concerne le classpath, si j'ai bien compris on peut reproduire ce comportement (cad ne donner que le nom de la classe et à partir de ca retrouver tout le chemin du fichier de classe) en rajoutant ".php" à la fin et en rajoutant le chemin des répertoires de classe dans le include_path ?

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Citation Envoyé par lysandre Voir le message
    Pourquoi dis-tu ca? Je travailles sous php5 et cela marche très bien...?
    Oui mais tu n'utilises pas la notion de visibilité (public/protected/private), ce qui implique un design OO incomplet. Si tu utilisais la syntaxe PHP5, ton application serait plus conforme aux principes OO reconnus et le code serait donc mieux organisé (je parle de l'évolution de tes applis).



    Citation Envoyé par lysandre Voir le message
    Oui on peut dire ca... mais include_path peut-il etre modifié même quand on est en hébergement mutualisé?
    J'imagine que cela dépend des hébergeurs...


    Citation Envoyé par lysandre Voir le message
    Ok merci pour l'info. En fait c'est surtout require_once que je ne connaissais pas. Par contre si je me trompe pas, dans le lien que tu m'as donné rien n'est prévu pour charger les classes étendues ou utilisées en tant qu'occurences dans d'autres classes...? Mais avec cette fonction require_once, c'est vrai qu'on peut faire un require_once de toute les classes étendues et appelées avant la déclaration de la classe qui les étends ou les appelle (et ce sans problème puisque require_once...porte bien son nom ).
    Tu sembles avoir compris le principe de require_once et include_once, mais apparemment il te reste à découvrir le merveilleux principe d'__autoload()

    Citation Envoyé par lysandre Voir le message
    En ce qui concerne le classpath, si j'ai bien compris on peut reproduire ce comportement (cad ne donner que le nom de la classe et à partir de ca retrouver tout le chemin du fichier de classe) en rajoutant ".php" à la fin et en rajoutant le chemin des répertoires de classe dans le include_path ?
    C'est exactement cela

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par Yogui Voir le message
    Oui mais tu n'utilises pas la notion de visibilité (public/protected/private), ce qui implique un design OO incomplet. Si tu utilisais la syntaxe PHP5, ton application serait plus conforme aux principes OO reconnus et le code serait donc mieux organisé (je parle de l'évolution de tes applis).

    Hoho, j'ai maintenant découvert autoload mais tu viens de me faire découvrir quelque chose d'encore mieux, je ne savais pas que php5 s'était rapproché de la poo plus classique! Il y a public, protected, private mais surtout static!!!
    Je ne sais pas combien de fois par jour je me suis dit que les fonctions et membres statiques manquaient à php!!
    Par contre l'utilisation du mot-clef "parent" ne semble pas conforme à ce que je connais (en fait je connais surtout actionscript 2.0). Alors que dans actionscript "parent" désigne l'objet contenant l'objet dans lequel il est appelé, dans php5 il semble désigner la fonction ou élément de la classe dont la classe actuelle est l'extension...

    pour __autoload, si j'ai bien compris, la fonction que l'on définis qui porte ce nom est appelée à chaque classe utilisée mais non déclarée, avec comme paramètre le nom de la classe. Cela suppose donc obligatoirement que le fichier porte le meme nom que le classe (bon ca c'est préférable de tout facon pour ne pas s'emeler les pinceaux), mais aussi qu'on ai mis les chemins des répertoires dans l'include_path. Si on ne peut pas mettre les chemins dans l'include_path, il faut qu'__autoload utilise un tableau prédéfini par nos soins qui contient les chemins des classes...ce qui revient à la classe que j'ai crée.

    Il me semble que je ne peux pas modif l'include_path pas car je suis en mutualisé, mais je crois que je vais tout de même utiliser ma classe, avec quelques améliorations: tout va être déclaré static (comme ca inutile de créer une occurence et la déclarer globale dans chaque fonction) et je vais utiliser include_once ce qui va permettre de me passer de la variable $included.
    Mhhh il faut que j'y réfléchisse, __autoload c'est très sympa il est vrai, même pas besoin de faire classmanage::inclure()...Par contre je me demandes si ca marche en cas d'appel à un membre ou fonction statique...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 193
    Points : 68
    Points
    68
    Par défaut
    Bon après petit essai, __autoload gère même l'appel à des membres statiques de classes:

    Le code suivant marche très bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function __autoload($class){
    echo $class;
    include_once("../classes/".$class.".php");
    }
     
    echo classmanage::$limit;
    Je crois que je vais peut-être passer à autoload alors...
    Donc classmanage n'est plus utile que pour ceux qui sont en php<5

    Merci Yogui!!

  7. #7
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    En PHP, "parent::" correspond à ce que tu connais en ActionScript comme "this.inherited()"

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Citation Envoyé par lysandre Voir le message
    Bon après petit essai, __autoload gère même l'appel à des membres statiques de classes:

    Le code suivant marche très bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function __autoload($class){
    echo $class;
    include_once("../classes/".$class.".php");
    }
     
    echo classmanage::$limit;
    Je crois que je vais peut-être passer à autoload alors...
    Donc classmanage n'est plus utile que pour ceux qui sont en php<5

    Merci Yogui!!
    Au passage tu peux faire bien mieux avec spl_autoload_register.
    C'est ce que j'utilise désormais. Si j'ai des modules y ou Y j'y colle un fichier loader qui déclare et attache un nouveau callback à autoload. Faut juste que les callbacks ne portent pas le même nom. Derrière cela permet à chacun de décrire sa propre arbo de fichier dans son module sans que je ne m'en préoccupe. et sans que l'application n'ai à la connaitre.

    a plus

Discussions similaires

  1. Classe générique pour simplifier l'utilisation des fichiers
    Par Oprichnik dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 10
    Dernier message: 09/08/2007, 23h15
  2. Réponses: 5
    Dernier message: 02/08/2007, 00h28
  3. Réponses: 9
    Dernier message: 05/04/2005, 09h39
  4. execution d'un prog avec des fichiers multi-class
    Par Ice-B dans le forum Général Java
    Réponses: 2
    Dernier message: 05/08/2004, 11h43
  5. [Inclusion des fichiers] hierarchie
    Par Casp dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 09/07/2004, 12h43

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