Recupere l'objet parent d'une classe fille [Résolu]

Messages postés
29
Date d'inscription
jeudi 28 octobre 2004
Dernière intervention
19 novembre 2008
- 18 mars 2008 à 12:18 - Dernière réponse :
Messages postés
2492
Date d'inscription
jeudi 30 novembre 2006
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.
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
2492
Date d'inscription
jeudi 30 novembre 2006
Dernière intervention
14 janvier 2011
- 18 mars 2008 à 13:24
3
Merci
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

Merci neigedhiver 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de neigedhiver
Messages postés
2492
Date d'inscription
jeudi 30 novembre 2006
Dernière intervention
14 janvier 2011
- 18 mars 2008 à 13:04
0
Merci
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
Commenter la réponse de neigedhiver
Messages postés
29
Date d'inscription
jeudi 28 octobre 2004
Dernière intervention
19 novembre 2008
- 18 mars 2008 à 13:17
0
Merci
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.
Commenter la réponse de knabis2000
Messages postés
29
Date d'inscription
jeudi 28 octobre 2004
Dernière intervention
19 novembre 2008
- 18 mars 2008 à 14:02
0
Merci
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.

 
Commenter la réponse de knabis2000
Messages postés
2492
Date d'inscription
jeudi 30 novembre 2006
Dernière intervention
14 janvier 2011
- 18 mars 2008 à 14:59
0
Merci
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
Commenter la réponse de neigedhiver

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.