我正在尝试将抽象父类中的属性与子类中的相同属性合并。代码看起来像这样(除了在我的实现中,有问题的属性是一个数组,而不是一个整数):
abstract class A {
public $foo = 1;
function __construct() {
echo parent::$foo + $this->foo; # parent::$foo NOT correct
}
}
class B extends A {
public $foo = 2;
}
$obj = new B(); # Ideally should output 3
现在我意识到构造函数中的parent :: $ foo在这里不会按预期工作,但是如何在不将值硬编码到构造函数或在父类中创建其他属性的情况下合并属性值? / p>
答案 0 :(得分:3)
你不能直接这样做。您需要在B
的构造函数中定义它,因为B->$foo
会在编译时覆盖A
(因此A->$foo
会丢失):
abstract class A {
public $foo = 1;
function __construct() {
echo $this->foo;
}
}
class B extends A {
public function __construct() {
$this->foo += 2;
}
}
现在,有很多方法,但它们涉及Reflection
而会变脏。不要那样做。只需在构造函数中递增它并完成...
答案 1 :(得分:3)
在父类的构造函数中,执行以下操作:
<?php
abstract class ParentClass {
protected $foo = array(
'bar' => 'Parent Value',
'baz' => 'Some Other Value',
);
public function __construct( ) {
$parent_vars = get_class_vars(__CLASS__);
$this->foo = array_merge($parent_vars['foo'], $this->foo);
}
public function put_foo( ) {
print_r($this->foo);
}
}
class ChildClass extends ParentClass {
protected $foo = array(
'bar' => 'Child Value',
);
}
$Instance = new ChildClass( );
$Instance->put_foo( );
// echos Array ( [bar] => Child Value [baz] => Some Other Value )
基本上,魔术来自get_class_vars( )
函数,它将返回在该特定类中设置的属性,而不管子类中设置的值。
如果要使用该函数获取ParentClass值,可以在ParentClass本身内执行以下任一操作:get_class_vars(__CLASS__)
或get_class_vars(get_class( ))
如果要获取ChildClass值,可以在ParentClass或ChildClass中执行以下操作:get_class_vars(get_class($this))
尽管这与仅访问$this->var_name
相同(显然,这取决于在变量范围)。
答案 2 :(得分:0)
你做不到。您拥有的最佳选择是拥有另一处房产。我知道你已经知道了,但那是最好的解决方案。
<?php
class A {
protected $_foo = 2;
}
class B extends A {
protected $foo = 3;
function bar( ) {
return $this->_foo + $this->foo;
}
}
这是你最好的选择。