Рассмотрим этот класс:Как 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;
}
}
Я перегружая магический __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
@Confluence: Спасибо ... мне было интересно, где я это прочитал. :) Не удалось найти его в руководстве; Я начинал задаваться вопросом, не подумал ли я об этом. Но все мои тесты подтвердили это, поэтому ... – cHao
Этот ответ был так полезен! –