我有一个以下类层次结构,在下面的复制脚本中显示:
header('Content-Type: text/plain');
class A
{
public $config = array(
'param1' => 1,
'param2' => 2
);
public function __construct(array $config = null){
$this->config = (object)(empty($config) ? $this->config : array_merge($this->config, $config));
}
}
class B extends A
{
public $config = array(
'param3' => 1
);
public function __construct(array $config = null){
parent::__construct($config);
// other actions
}
}
$test = new B();
var_dump($test);
?>
输出:
object(B)#1 (1) {
["config"]=>
object(stdClass)#2 (1) {
["param3"]=>
int(1)
}
}
我想要的是,A :: $config不能被B :: $config覆盖.可能有很多来自B的后代类,我想更改$config,但如果匹配所有父元素的$config值,我需要合并/覆盖这些$config值.
问:我怎么能这样做?
我试过使用array_merge()但是在非静态模式下这些变量只是覆盖它们自己.有没有办法在没有静态(后期静态绑定)的情况下实现类树的合并效果?
解决方法:
您可以重新构建扩展类的实例化方式
class B extends A
{
private $defaults = array('param3' => 1);
public function __construct(array $config = null){
parent::__construct($config?array_merge($this->defaults, $config):$this->defaults);
}
}
标签:php,oop,inheritance,array-merge
来源: https://codeday.me/bug/20190716/1478625.html