【发布时间】:2012-08-05 17:13:38
【问题描述】:
我得到了一些奇怪的结果,最好通过显示代码来解释。
假设我创建了一个具有 3 个方法的 A 类:
add 方法 - 添加其他 A 类实例以供以后使用
_调用 魔术方法 - 添加动态变量和值
_callStatic 静态魔术方法 - 这些方法帮助我创建更具可读性的 A 类
所以类是:
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 实例,不是吗?
标签: php inheritance static-methods