2010-07-22 4 views
1

Пожалуйста, ознакомьтесь с приведенным ниже кодом.PHP - получить общедоступные переменные классов?

class A { 
    public function __construct() { 

    } 
} 

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

Как получить общие переменные класс В пределах от родительского класса, не зная, что именно они?

+0

Err, вы не можете? Если вы не передадите ссылку класса B на A или что-то еще. – Robus

+0

Это не ООП предназначается, чтобы быть, но должны быть какие-то обходные пути .. – TheHippo

+0

Собственно родительский класс не должен знать о своих унаследованных реализациях. Возможно, наследование не является правильной стратегией здесь. Посмотрите на состав или шаблон шаблона. –

ответ

-2

Если класс B расширяет класс, то я не предполагаю, что он делает любое чувство OO для класса A доступным для общедоступных переменных его дочернего элемента.

Редактировать Я был бы признателен, если люди, которые меня превзошли, посчитают свое решение, спасибо.

+0

OK: вы проигнорированы как экземпляр B, выполняющий метод, объявленный в A, может получить доступ к любой переменной или функции B-объявления. Это вопрос интерпретации вопроса, хотя, возвращаясь, я понимаю, что из него можно извлечь несколько значений. Разумеется, объект «чистого А» не может получить к нему доступ, но тогда нет объекта B, о котором можно говорить, как указано в вопросе. Поскольку получение свойств так же просто, как 'get_object_vars()', мы предполагаем проверку в пределах области, которая имеет доступ к закрытым/защищенным переменным. – Wrikken

+0

Благодарим вас за объяснение. Я ответил в духе комментария Феликса Клинга. ClassA, являющийся родительским классом, не может знать об общедоступных переменных классов, которые наследуются от него. – zahstra

+0

Объект «чистый А» может определенно получить к нему доступ.Они объявлены 'public', а не' protected' ... – ircmaxell

0

Инжектируйте B-класс-объект в A-Class-Object:

class A { 
    public $b; 

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

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

Таким образом, конструктор ожидает Objekt из B здесь. И теперь давайте использовать его.

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

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

EDIT: К сожалению, я не видел, что класс B расширяет класс А. Так просто забыть о моем решении :)

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(); 

выхода (не замечают нет «B», но публики в «d» находится там, с упоминанием он объявлен в А):

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

подкласс наследует от суперкласса. Так же, как отец не наследует никаких генов от своей дочери, только дает им, это невозможно. Ну, технически это так, но это не правильный способ реализации объектно-ориентированного поведения.

Я рекомендую давать переменную суперкласса, таким образом он доступен по обоим классам, хотя я не уверен, что вы используете его для.

Надеюсь, что это поможет!

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"; 
} 
Смежные вопросы