Appel fonction d'une classe à partir d'une autre classe

JFGore
Invité n'ayant pas de compte PHPfrance

04 avr. 2007, 14:52

Bonjour

j'ai un fichier index.php, j'instancie une classe X dans laquelle se trouve une fonction qui instancie une autre classe Y. Quand j'instancie la classe X ca marche, ensuite quand j'apelle la fonction qui instancie la classe Y ca se passe bien, juste après avoir instancié je teste le type (gettype) cela me retourne objet. Par contre dans mon index.php lorsque j'apelle une fonction de la classe Y, j'ai un message d'erreur me disant que ce n'est pas un objet

Fatal error: Call to a member function get_nom_rubrique() on a non-object in /homepages/index.php on line 19

merci de votre aide
j'espere avoir ete claire

JFG

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 avr. 2007, 14:54

Donne nous le code concerné de la classe X.

J'ai l'idée que tu essayes de faire $X->methode() alors qu'il faudrait faire $X->Y->methode()
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

04 avr. 2007, 15:24

index.php :

Code : Tout sélectionner

<?php function __autoload($classe) { $fichier = "$classe.php"; require_once($fichier); } $annu = new annu(); $annu->set_nom_annu('XXX'); $annu->ajout_rub('YYY'); echo $rubr->get_nom_rub().'<br>'; //apelle de la classe Y ?>
Classe X :

Code : Tout sélectionner

<?php class annu { public function set_nom_annu($nom) { $this->nom_annu = $nom; } public function ajout_rub($nom) { $rub = new rub($nom); } ?>
Classe Y :

Code : Tout sélectionner

<?php class rub { public function get_nom_rub() { return $this->nom_rub; } ?>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 avr. 2007, 15:36

Dans ton fichier index.php, je vois la ligne
echo $rubr->get_nom_rub().'<br>'; //apelle de la classe Y 
mais aucune instanciation ...

$rub n'existe que dans la classe X ... et toi, tu essayes d'y accéder depuis l'extérieur de la classe ;)

Il faut que tu fasses une méthode dans ta classe X qui permette d'utiliser $rub
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

04 avr. 2007, 16:12

faute de frappe :

echo $rub->get_nom_rub().'<br>'; //apelle de la classe Y

juste avant g apellé la fonction annu->ajout_rub('YYY');

cette fonction instancie rub

Petit nouveau ! | 3 Messages

04 avr. 2007, 16:16

En fais quand on instancie une classe dans une classe elle n'est accessible que dans celle-ci ?

ViPHP
ViPHP | 1024 Messages

04 avr. 2007, 17:13

ta variable $rub est locale, et accessible uniquement depuis la méthode.

une variante :
class annu {

   public function set_nom_annu($nom) {
      $this->nom_annu = $nom;
   }

   public function ajout_rub($nom) {
      $this->rub = new rub($nom);
   }
puis :

echo $annu->rub->get_nom_rub();

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

04 avr. 2007, 17:15

Ce n'est pas parce que tu instancies $rub DANS la classe X que tu peut accéder à cette variable dans le code qui instancie la classe X : c'est ce qu'on appelle la portée des variables.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 3 Messages

04 avr. 2007, 20:10

Merci beacoup pour ton aide

les classes sont vues comme des variables pour PHP5 si j'ai bien compris

JFG

Eléphant du PHP | 120 Messages

13 avr. 2007, 15:24

pour remédier à ton blèm tu peux aussi inclure dans le fichier de la classe appelante le fichier de la classe appelée
ça donne:
include_once("rub.php");
class annu {

   public function set_nom_annu($nom) {
      $this->nom_annu = $nom;
   }

   public function ajout_rub($nom) {
      $rub = new rub($nom);
   }

et comme ça tu peux juste instancier "annu" sans t'occuper de "rub"