|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
|
Membre du Club
![]() Inscription : septembre 2007 Messages : 193 ![]() |
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 :
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 :
Car inclure php_data inclus automatiquement file. Le code suivant: Code :
Le code suivant ne pose pas non plus de problème: Code :
-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 |
||||||||
|
|
00
|
|
|
#2 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
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
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#3 | |||
|
Membre du Club
![]() Inscription : septembre 2007 Messages : 193 ![]() |
Citation:
Citation:
Citation:
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 ? |
|||
|
|
00
|
|
|
#4 | ||||
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Citation:
Citation:
Citation:
![]() Citation:
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
||||
|
|
00
|
|
|
#5 | |
|
Membre du Club
![]() Inscription : septembre 2007 Messages : 193 ![]() |
Citation:
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... |
|
|
|
00
|
|
|
#6 | ||
|
Membre du Club
![]() Inscription : septembre 2007 Messages : 193 ![]() |
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 :
Donc classmanage n'est plus utile que pour ceux qui sont en php<5 Merci Yogui!! |
||
|
|
00
|
|
|
#7 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
En PHP, "parent::" correspond à ce que tu connais en ActionScript comme "this.inherited()"
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#8 | |||
|
Membre Expert
![]() Inscription : janvier 2007 Messages : 1 452 ![]() |
Citation:
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 |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com