내가 아래 재생 스크립트에 도시 된 다음 클래스 계층 구조를 가지고 객체 :병합 배열 속성은
<?php
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
가 오버라이드 (override)하지 않는 것이있다 에 의해 B::$config
. B
에서 자손 클래스가 많이있을 수 있습니다. 여기에서 $config
을 변경하려고합니다. 그러나 $config
부모의 값과 병합/덮어 쓰려면이 값이 $config
이어야합니다.
Q : 어떻게하면됩니까?
나는 array_merge()
을 사용해 보았지만 비 정적 모드에서는 이러한 변수가 무시됩니다. static
(늦은 정적 바인딩)없이 클래스 트리의 병합 효과를 얻을 수있는 방법이 있습니까?
에서 적응 당신은 아마 * * 현재 클래스, 부모, 부모 등과 배열을 병합을 검토, Reflection'와 반성 '의 많은 것을 할 수 있습니다. http://php.net/reflectionclass를 참조하십시오. – deceze
@deceze 답변을 작성하여 나중에 다른 사용자에게 유용 할 것입니다. :) –
@deceze 음, 과열이 많이 발생합니까? – BlitZ