2010-07-22 5 views
1

Veuillez tenir compte du code ci-dessous.PHP - Obtenir des variables publiques Classes?

class A { 
    public function __construct() { 

    } 
} 

class B extends A { 
    public $a = "a"; 
    public $b = "b"; 
    public $c = "c"; 
} 

Comment puis-je obtenir des variables publiques de la classe B à partir de la classe parente, sans savoir précisément ce qu'ils sont?

+0

Err, vous ne pouvez pas? Sauf si vous passez une référence de classe B à A, ou quelque chose. – Robus

+0

Ce n'est pas la POO qui est censée l'être, mais il devrait y avoir quelques solutions de contournement. – TheHippo

+0

En fait, une classe parent ne devrait pas connaître ses implémentations héritées. Peut-être que l'héritage n'est pas la bonne stratégie ici. Jetez un oeil à la composition ou le modèle de modèle. –

Répondre

-2

Si la classe B s'étend classe A, je ne pense pas qu'elle ait un quelconque sens OO pour que la classe A puisse accéder aux variables publiques de son enfant.

Editer Je vous serais reconnaissant si les personnes qui me rabaissaient motivaient leur décision, merci.

+0

OK: vous êtes downvoted en tant qu'instance B exécutant une méthode déclarée en A peut accéder à toute variable ou fonction déclarée B. C'est une question d'interprétation de la question cependant, en revenant je réalise que de multiples significations pourraient en être dérivées. Un objet «pur A» ne peut bien sûr pas y accéder, mais il n'y a pas d'objet B dont il est question dans la question. Comme obtenir des propriétés est aussi simple que 'get_object_vars()', nous supposons inspecter dans une portée qui a accès à des variables privées/protégées. – Wrikken

+0

Merci pour l'explication. J'ai répondu dans l'esprit du commentaire de Felix Kling. ClassA, étant une classe parente, ne peut pas connaître les variables publiques des classes qui en héritent. – zahstra

+0

Un objet "pur A" pourrait certainement y accéder.Ils sont déclarés 'public', pas' protégés' ... – ircmaxell

0

Injecter le B-classe d'objets dans la Classe-objet:

class A { 
    public $b; 

    public function __construct(B $b_object) { 
     $this->b = $b; 
    } 
} 

class B { 
    public $a = "a"; 
    public $b = "b"; 
    public $c = "c"; 
} 

Ainsi, le constructeur attend une Objekt de B ici. Et maintenant, utilisons-le.

$b = new B(); 
$a = new A($b); 

$a->b->a; 
$a->b->b; 
$a->b->c 

EDIT: Désolé, je ne vois pas que la classe B étend la classe A. Il suffit donc d'oublier ma solution :)

8
class A { 
    public $d; 
    public function __construct() { 
     $reflect = new ReflectionClass($this); 
     $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC); 
     var_dump($props); 
    } 
} 

class B extends A { 
    public $a = "a"; 
    private $b = "b"; 
    public $c = "c"; 
} 
new B(); 

sortie (avis non 'b', mais le public A 'd' est là, avec une mention qu'il est déclaré en a):

array(3) { 
    [0]=> 
    &object(ReflectionProperty)#3 (2) { 
    ["name"]=> 
    string(1) "a" 
    ["class"]=> 
    string(1) "B" 
    } 
    [1]=> 
    &object(ReflectionProperty)#4 (2) { 
    ["name"]=> 
    string(1) "c" 
    ["class"]=> 
    string(1) "B" 
    } 
    [2]=> 
    &object(ReflectionProperty)#5 (2) { 
    ["name"]=> 
    string(1) "d" 
    ["class"]=> 
    string(1) "A" 
    } 
} 
0

une sous-classe hérite de la superclasse. Tout comme un père n'hérite d'aucun gène de sa fille, ne fait que leur donner, ce n'est pas possible. Eh bien, techniquement c'est, mais ce n'est pas la bonne façon d'implémenter un comportement orienté objet.

Je recommande de donner la variable à la superclasse, de cette façon, il est accessible par les deux classes, même si je ne suis pas sûr de ce que vous l'utilisez.

Espérons que ça aide!

0
class A {   
    public function __construct() { 
     $array = get_class_vars('B'); // public vars of class B 
    } 
} 

class B extends A {  
    public $a = "a"; 
    public $b = "b"; 
    public $c = "c"; 
} 
Questions connexes