Problème avec le chargement de classe avec plus de 2 niveaux

Petit nouveau ! | 2 Messages

02 mars 2008, 06:54

Bonjour,
pour commencer, je suis encore à mes début en PHP et programmation OO. Alors j'ai besoin d'un coup de main pour comprendre et résoudre un problème.

J'ai recoder un exemple plus simple de l'imbrication de classe que celui qui me pose le problème.

Au final je désire avoir un fichier de classe pour chacune.

Voici : lorsque je fais un appel à une classe qui elle même en appel une (3 ième niveau) cela me donne l'erreur de chargement du fichier de la classe "Warning: require_once(..../Ctest_B.php) [function.require-once]: failed to open stream: No such file or directory in....." et le message "Fatal error: require_once() [function.require]: Failed opening required '..../Ctest_B.php' (include_path='....' in ...."

Les script qui suivent permette de vérifier :
- le fonctionnement si les trois classes sont dans le même fichier. Cela fonctionne pour moi;
- le fonctionnement de trois classes dans trois fichiers différents. Cela ne fonctionne pas pour moi.

Voici les fichiers si quelqu'un veux bien m'aider :

Code : Tout sélectionner

<?php // fichier index.php global $Root; global $ClassPath; $Root = $_SERVER['DOCUMENT_ROOT']; $ClassPath = $Root . "/class/"; print "<br>appel à " . $Root . "<br>"; require ($Root . '/ClassLoader.php'); include ("TestClass.php"); ?> ------------------------------------------------------------------------------- <?php // fichier ClassLoader.php function __autoload($className) { global $Root; $ClassPath = $Root . "/class/"; print "Chargement du fichier de la classe '" . $ClassPath . $className . ".php'<br>"; require_once($ClassPath . $className . ".php"); } ?> --------------------------------------------------------------------------- <?PHP // fichier TestClass.php ?> <HTML lang=fr> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="Expire" content="now" /> </Head> <Body> <TABLE align="center"> <FORM Action="index.php" Method="post" enctype="multipart/form-data"> <TR><TD> <H1>Test des class Ctest</H1> </TD></TR> <TR><TD> <fieldset id="Ctest"> <?php print "Démonstration de trois classes déclarées dans le même fichier.<br>"; print "Appel de la classe FFF<br>"; $F = new CtestFFF(); $F->pFFF(); Print "<br><br>"; Print "Démonstration de trois classes déclarées dans des<br>"; Print "fichiers différents avec la même structure d'appel.<br>"; print "Démonstration du fonctionnement de la classe A<br>"; $A = new CtestA(); $A->pA(); print "<br>Démonstration du fonctionnement de la classe B qui utilise A<br>"; $B = new CtestB(); $B->pB(); print "<br>Démonstration du fonctionnement de la classe C qui utilise B et A<br>"; $C = new CtestC(); $C->pC(); ?> </fieldset> </TD></TR> <input type="hidden" name="Etape" value="2"> <TR> <TD><br><center><INPUT Type='submit' Action='Verifier'></center></TD> </TR> </FORM> </TABLE> </body> </HTML> --------------------------------------------------------------------------------------------- <?php // fichier : . /Class/CtestFFF.php class CtestF { var $A; function pF() { $this->A = "Class F active<br>"; print $this->A; } } class CtestFF { var $B; function pFF() { $this->B = "CLass FF active<br>"; print $this->B; $C = new CtestF(); $C->pF(); } } class CtestFFF { var $B; function pFFF() { $this->B = "CLass FFF active<br>"; print $this->B; $C = new CtestFF(); $C->pFF(); } } ?> ------------------------------------------------------------------------------------ <?php // fichier : ./Class/CtestA.php class CtestA { var $A; public function pA() { $this->A = "Class A active<br>"; print $this->A; } } ?> ---------------------------------------------------------------------------------- <?php // fichier : ./Class/CtestB.php class CtestB { var $B; public function pB() { $this->B = "Classe B active<br>"; print $this->B; $C = new CtestA(); $C->pA(); } } ?> ---------------------------------------------------------------------------------------------- <?php // fichier : ./Class/CtestC.php class CtestC { var $C; public function pC() { $this->C = "Class C active<br>"; print $this->C; $D = new Ctest_B; $D->pB(); } } ?>
L'essai me donne ceci :

Code : Tout sélectionner

Démonstration de trois classes déclarées dans le même fichier. Appel de la classe FFF Chargement du fichier de la classe 'D:/Apache Group/Apache2/www/Test/class/CtestFFF.php' CLass FFF active CLass FF active Class F active Démonstration de trois classes déclarées dans des fichiers différents avec la même structure d'appel. Démonstration du fonctionnement de la classe A Chargement du fichier de la classe 'D:/Apache Group/Apache2/www/Test/class/CtestA.php' Class A active Démonstration du fonctionnement de la classe B qui utilise A Chargement du fichier de la classe 'D:/Apache Group/Apache2/www/Test/class/CtestB.php' Classe B active Class A active Démonstration du fonctionnement de la classe C qui utilise B et A Chargement du fichier de la classe 'D:/Apache Group/Apache2/www/Test/class/CtestC.php' Class C active Chargement du fichier de la classe 'D:/Apache Group/Apache2/www/Test/class/Ctest_B.php' Warning: require_once(D:/Apache Group/Apache2/www/Test/class/Ctest_B.php) [function.require-once]: failed to open stream: No such file or directory in D:\Apache Group\Apache2\www\Test\ClassLoader.php on line 7 Fatal error: require_once() [function.require]: Failed opening required 'D:/Apache Group/Apache2/www/Test/class/Ctest_B.php' (include_path='.;D:/Apache Group/Apache2/www/Test') in D:\Apache Group\Apache2\www\Test\ClassLoader.php on line 7
Il ne devrait pas y avoir de problème à faire des appels de ce type !

Merci pour votre aide,

Jean

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

ViPHP
ViPHP | 5924 Messages

02 mars 2008, 11:14

$D = new Ctest_B;
et
class CtestB

Petit nouveau ! | 2 Messages

02 mars 2008, 15:33

Merci! Ces bien cela.

La chose est cocasse si l’on tien compte que pour l'exemple j’ai recodé trois classe en reproduisant le même erreur sans m’en rendre compte …. :oops:

Bon, je souhaite avoir une question un peu plus intéressante à résoudre la prochaine fois. Et ainsi me sauvé la face …

Moral pour moi : même après des années de codage dans d’autre langage, un débutant reste un débutant avec des erreurs de débutant !

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

02 mars 2008, 16:05

Modération :
Jean, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 5924 Messages

02 mars 2008, 16:19

En même temps, le comportement du script ainsi que le message d'erreur auraient dû te mettre la puce à l'oreille… :-/