请考虑以下代码。
class A {
public function __construct() {
}
}
class B extends A {
public $a = "a";
public $b = "b";
public $c = "c";
}
如何从父类中获取B类的公共变量而不确切知道它们是什么?
答案 0 :(得分: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',但A的公共'd'在那里,提到它在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"
}
}
答案 1 :(得分:2)
答案 2 :(得分:0)
将B-Class-Object注入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";
}
所以构造函数在这里等待B的Objekt。现在让我们使用它。
$b = new B();
$a = new A($b);
$a->b->a;
$a->b->b;
$a->b->c
编辑: 对不起,我没有看到B级扩展到A级。所以忘记我的解决方案:)
答案 3 :(得分:0)
子类从超类继承。就像父亲没有从女儿那里继承任何基因一样,只给予他们,这是不可能的。嗯,从技术上讲,它是,但它不是实现面向对象行为的正确方法。
我建议将变量赋给超类,这样两个类都可以访问它,虽然我不确定你使用它是什么。
希望有所帮助!
答案 4 :(得分: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";
}
答案 5 :(得分:-2)
如果B类扩展 A类,我认为它对A类没有任何意义,因为它能够访问其子级的公共变量。
编辑如果投票给我的人会推理他们的决定,我将不胜感激,谢谢。