コードを表示することで最もよく説明される奇妙な結果が得られます。
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
(
)
)
しかし、クラス A からの継承としてクラス B を作成しようとすると、次のようになります。
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 が A クラスではなく B クラスから実行されているかのようです。
何か案は ?