Précédent   Forum des professionnels en informatique > PHP > Langage > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc. pour PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/08/2008, 20h30   #1
Membre du Club
 
Inscription : septembre 2007
Messages : 193
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : septembre 2007
Messages : 193
Points : 40
Points : 40
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 :
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 :
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 :
1
2
 
$cm->inclure("php_data");
Car inclure php_data inclus automatiquement file.
Le code suivant:
Code :
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 :
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
lysandre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2008, 09h36   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2008, 13h07   #3
Membre du Club
 
Inscription : septembre 2007
Messages : 193
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : septembre 2007
Messages : 193
Points : 40
Points : 40
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 ?
lysandre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2008, 13h50   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2008, 18h24   #5
Membre du Club
 
Inscription : septembre 2007
Messages : 193
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : septembre 2007
Messages : 193
Points : 40
Points : 40
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...
lysandre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2008, 18h34   #6
Membre du Club
 
Inscription : septembre 2007
Messages : 193
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : septembre 2007
Messages : 193
Points : 40
Points : 40
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 :
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!!
lysandre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2008, 19h00   #7
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2008, 19h43   #8
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
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 :
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
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h51.


 
 
 
 
Partenaires

Hébergement Web