我得到了一些奇怪的結果,最好通過顯示代碼來解釋。當使用__callStatic函數時奇怪的遞歸結果
說我創造它有3種方法A類:
添加方法 - 添加其他的A類實例在以後的時間
_ 呼叫魔術方法中使用 - 添加動態VAR和有值
_callStatic靜態魔術方法 - 這種方法幫助我創建一個類更具可讀性
,所以這個類是:
class A_Class {
protected $name;
protected $varList;
protected $childs = array();
protected static $tabCount = 0;
public function __construct($name) {
$this->name = $name;
}
public function add() {
if (func_num_args()) {
$this->childs = array_merge($this->childs, func_get_args());
}
return $this;
}
public function __call($name, $arguments) {
if (count($arguments) > 0) {
$this->varList[$name] = $arguments[0];
}
return $this;
}
public static function __callStatic($name, $arguments) {
return new A_Class($name);
}
}
,現在當我使用它:
$a = A_Class::MyNameA();
$a->someDynamicVar("I am the var data");
$a->add(A_Class::ANotherNameA());
print_r($a);
作品就好導致:
A_Class Object
(
[name:protected] => MyNameA
[varList:protected] => Array
(
[someDynamicVar] => I am the var data
)
[childs:protected] => Array
(
)
)
但是,如果我嘗試創建B類從A類繼承,像這樣:
class B_Class extends A_Class {
public function __construct($name) {
parent::__construct($name);
$this->add(A_Class::NewAClass());
}
}
並嘗試以下操作:
$b = new B_Class("NewBClassInstance");
print_r($b);
我得到一個遞歸的結果:
B_Class Object
(
[name:protected] => B-MAN
[varList:protected] =>
[childs:protected] => Array
(
[0] => B_Class Object
*RECURSION*
)
)
,我認爲是奇怪的。
這是因爲如果__callStatic正在從B類運行而不是A類
有什麼想法?
我覺得很奇怪,在varList中沒有包含A_Class實例的行'add',不是? – 2012-08-05 17:41:34