は、このクラスを考えてみましょう:ここでPHPは無限回帰を避けますか?
class test
{
public function __set($n, $v)
{
echo "__set() called\n";
$this->other_set($n, $v, true);
}
public function other_set($name, $value)
{
echo "other_set() called\n";
$this->$name = $value;
}
public function t()
{
$this->t = true;
}
}
私はPHPのマジック__set()
メソッドをオーバーロードしています。 test
クラスのオブジェクトにプロパティを設定するたびに__set()
が呼び出され、other_set()
が呼び出されます。
$obj = new test;
$test->prop = 10;
/* prints the following */
__set() called
other_set() called
しかしother_set()
次の行$this->$name = $value
を持っています。これにより、無限再帰を引き起こす__set()
が呼び出されるべきではありませんか?
私は、クラス外のものを設定するときにのみ__set()
を呼び出すと理論化しました。しかし、あなたがt()
メソッドを呼び出す場合は、明らかにそれが__set()
を通過することがわかります。
これは正しいです。実装の詳細を見たい人は、 'zend_object_handlers.c'にあります。 – Confluence
@影響:ありがと...私はそれをどこで読んでいるのだろうと思っていた。 :)マニュアルでそれを見つけることができませんでした。私はそれが想像していたのだろうかと思っていた。しかし、すべての私のテストはそれを確認したので... – cHao
この回答は役に立ちました! –