Как 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().

12
задан Confluence 4 April 2012 в 19:26
поделиться