knabis2000
Messages postés29Date d'inscriptionjeudi 28 octobre 2004StatutMembreDernière intervention19 novembre 2008
-
18 mars 2008 à 12:18
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 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.
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 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...
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 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.
$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).
knabis2000
Messages postés29Date d'inscriptionjeudi 28 octobre 2004StatutMembreDernière intervention19 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.
knabis2000
Messages postés29Date d'inscriptionjeudi 28 octobre 2004StatutMembreDernière intervention19 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
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").