2010-11-10 20 views
2

J'ai utilisé truquage d'héritage multiple comme indiqué dans Can I extend a class using more than 1 class in PHP?PHP truqué héritage multiple - objet ayant des attributs définis dans la classe parent faux disponible en classe étendue

Notez que la classe A se prolonge en fait la classe B et trucage est fait pour l'extension de Cela fonctionnait bien jusqu'à ce que j'aie besoin d'un attribut défini dans une fonction de classe C pour être disponible dans la classe A. Considérons une version éditée de ce code où j'appelle une fonction de classe C depuis une fonction de la classe A: -

//Class A 
class A extends B 
{ 
    private $c; 

    public function __construct() 
    { 
    $this->c = new C; 
    } 

    // fake "extends C" using magic function 
    public function __call($method, $args) 
    { 
    return call_user_func_array(array($this->c, $method), $args); 
    } 

//calling a function of class C from inside a function of class A 
    public function method_from_a($s) { 
    $this->method_from_c($s); 
    echo $this->param; //Does not work 
    } 

//calling a function of class B from inside a function of class A 
    public function another_method_from_a($s) { 
    $this->method_from_b($s); 
    echo $this->another_param; //Works 
    } 
} 

//Class C 

class C { 
    public function method_from_c($s) { 
     $this->param = "test"; 
    } 
} 

//Class B 
class B { 
    public function method_from_b($s) { 
     $this->another_param = "test"; 
    } 
} 


$a = new A; 
$a->method_from_a("def"); 
$a->another_method_from_a("def"); 

Ainsi, un attribut défini dans une fonction de classe C n'est plus disponible dans la classe A mais s'il est défini dans la classe B, il est disponible dans la classe A. Quel ajustement manque-t-il pour paramétrer les attributs dans le faux parent? travail en classe comme réel? Un attribut défini dans la fonction du faux parent doit être disponible dans toutes les classes de la hiérarchie comme dans le cas normal.

Merci

Résolu
I a ajouté la fonction magique __get() dans la classe A et cela a fonctionné.

public function __get($name) 
{ 
    return $this->c->$name; 
} 

Répondre

2

Ça ne marchera pas, parce que « param » est pas une propriété de A: il est en c, qui est une propriété de A.

Ce que vous devez faire est de définir la magic methods tels que __set et __get, qui __call parallèle pour les propriétés.

+0

merci .. Je suis sûr que c'est ce qui me manquait. Ai-je besoin de définir ces fonctions dans la classe A dans mon exemple? Si vous pouviez donner un petit exemple de code ... –

+0

ok je l'ai résolu. Vérifiez ma mise à jour. Merci pour la direction. J'ai maintenant appris un peu sur les fonctions magiques –