Recupere l'objet parent d'une classe fille

Résolu
knabis2000 Messages postés 29 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 19 novembre 2008 - 18 mars 2008 à 12:18
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 18 mars 2008 à 14:59
Bonjour a tous,

J'aurait une question :

Est il possible de recuperer l'instance de l'objet mere d'une classe fille ?

Petite explication :
Imaginons 2 classe
class A{
       public function A(){
            $this->a = 1;
            $this->b = 2;
      }
}

class B{
     public function B(){
           $this->c = 3;
    }
    public getParent(){
           ?????????
    }
}

Donc ce que je voudrait, c'est qu'a l'appel de $b->getParent() ca me renvoit un l'objet A crée lors de la creation de B.

Merci d'avance pour vos reponses.

5 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
18 mars 2008 à 13:24
Re,

Je comprends pas bien : "lorsque j'arrive sur une page qui a besoin d'un objet de type A il me mettait une erreur de classe incomplete."

Par exemple :

class A {
    // Plein de trucs
}

class B extends A {
    // Encore plein de trucs
}

class C {
    // Un tas de choses
}

function test(A $objet) {
    // Fait les tests
}

$monObjet = new B();
test($monObjet);

Ici, la fonction test nécessite en argument un objet qui soit une instance de A.
$monObjet étant une instance de B, qui étant A, alors $monObjet sera pris en compte comme argument valide pour la fonction test, puisqu'il est une instance de B mais aussi de A (B étendant A).

Par contre :

$monAutreObjet = new C();
test($monAutreObjet);
Ici, la fonction test() ne sera pas appelée, parce que l'objet passé en argument n'est pas une instance de A ou d'une de ses classes filles.

Je sais pas si c'est plus clair pour toi, mais pour moi, ton problème n'est pas clair...

Neige
3
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
18 mars 2008 à 13:04
Salut,

Tes notions d'objets sont erronnées. Lors de l'instanciation de l'objet de classe B, aucun objet de classe A n'est instancié : l'objet de classe B instancié hérite simplement des méthode et propriétés de la classe A, éventuellement redéfinies dans la classe B.

Ce que tu peux éventuellement faire, si vraiment tu le veux, c'est instancier un objet de la classe parente A. Ca, c'est faisable.

Une méthode élégante serait d'utiliser l'API de réflexion de PHP 5 :

$myB = new B();
$oRef = new ReflectionClass($myB);
$oParentClass = $oRef -> getParentClass();
if ($parentClass -> isInstantiable() && $oParentClass {
    $myParent = $oParentClass -> newInstance();
}

En PHP4, on peut faire comme ça :

$myB = new B();
$parentClass = get_parent_class($myB);
$myParent = new $parentClass();

La méthode PHP4 fonctionne aussi avec PHP5. Mais l'avantage de l'API de réflexion, c'est qu'on peut faire toute une batterie de tests qu'on ne peut pas faire en PHP4 (l'exemple n'en montre que 2 parmi beaucoup d'autres).

Neige
0
knabis2000 Messages postés 29 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 19 novembre 2008
18 mars 2008 à 13:17
Re,

Deja merci pour ta reponse.

Entre deux j'ai changé ma methode parce que je perdait trop de temps.
Maintenant ma classe B crée un objet A et je peut donc le recuperer.

Mais, juste pour ma connaissance:
Le probleme que je rencontré c'est que l'objet B etait enregistré dans une variable session est lorsque j'arrive sur une page qui a besoin d'un objet de type A il me mettait une erreur de classe incomplete.
Donc je voulait recuperer un objet de type A qui possedait tout les valeurs modifiés grace a la classe B.

Càd, en gros : la classe B crée un objet A grace a une serie de méthode propre a B et je voulais recupere l'objet A ainsi crée.

Voila, encore merci.
0
knabis2000 Messages postés 29 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 19 novembre 2008
18 mars 2008 à 14:02
Re Re,

Alors je vais essayer d'être plus clair, avec un exemple concret :

J'ai un objet Panier que j'enregistre dans une variable de session, dont je me sert dans plusieurs page.
Sur une page précise je crée un objet SavedPanier qui ajoute a Panier une fonction de chargement a partir d'une BDD. Donc en sortant de cette page je me retrouve avec un objet SavedPanier.
Seulement sur les autre page il attend un objet de type Panier (car pas d'inclusion de la classe SavedPanier ) il me dit alors : "The script tried to execute a method or access a property of an incomplete object".

Le but était de garder dans la classe Panier juste les propriétés, et de l'etendre au besoin pour gerer  l'affichage,la création, la modification, etc suivant le contexte de la page ...... Mais je crois que je vais oublier cette idée au plus vite.

Voila, j'espere que c'est plus clair

Merci.

 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
18 mars 2008 à 14:59
Re,

http://fr.php.net/manual/fr/function.unserialize.php

Note:
Directive unserialize_callback_func

Il est possible de définir une fonction de callback qui sera
appelée si une classe indéfinie est utilisée lors
de la délinéarisation
(ce qui évitera de voir l'objet recevoir le type
d'objet incomplet object "__PHP_Incomplete_Class").

Neige
0
Rejoignez-nous