Почему __get игнорирует эхо перед возвратом, если он недействителен? - PullRequest
0 голосов
/ 20 февраля 2012

В следующем примере

class Employee
{
    var $name;
    var $city;
    protected $wage;
    function __get($propName)
    {
        echo "__get called!<br />";
        $vars = array("name","city");
        if (in_array($propName, $vars))
        {
            return $this->$propName;
        } else {
            return "No such variable!";
        }
    }
}
$employee = new Employee();
$employee->name = "Mario";
echo $employee->name."<br />";
echo $employee->age;

Вывод:

Mario
__get called!
No such variable!

... смущает меня, я понимаю, что "__get позвонил!" появляется, когда $ employee-> name принимается, но почему оно не отображается, даже если $ employee-> age принимается? Я имею в виду ... он есть, но кажется, что __get учитывает только возврат в операторе if-else. Как это возможно?

Замечание: Конечно, __get запускается, когда обнаруживает, что $ age не существует при чтении, но ... когда он запускается, почему эхо в нем не работает?

Вывод: "__get call!" появился из-за одного вызова __get, в котором читается $ employee-> age.

Ответы [ 3 ]

4 голосов
/ 20 февраля 2012

Ваши предположения неверны.

Я понимаю, что "__get call!"появляется, когда $ employee-> name принимается

Нет, это не так.__get вызывается только при попытке доступа к участнику, которого не существует .Вы определили общедоступный член с именем $name, это то, что делает строка var $name.Чтение / запись в $employee->name никогда не вызовет магические __get или __set_ методы.

Это не $employee->name, что приводит к печати "__get called";$employee->name возвращает "Mario", значение, которое вы присвоили этому члену, и , что - это то, что печатается.Именно $employee->age вызывает печать "__get called".

Я попытался лучше объяснить строки и то, что они делают в отношении __get:

$employee = new Employee();
$employee->name = "Mario";      # assign to $name
echo $employee->name."<br />";  # read "Mario" from $name, does NOT invoke  __get
echo $employee->age;            # attempt to read $age, invokes __get

RE: Ваше наблюдение

Замечание: Конечно, __get запускается, когда обнаруживает, что $ age не существует при чтении, но ... когда он запускается, почему эхо в нем не работает?

Эхо работает .Причина, по которой вы видите только один "__get called!", заключается в том, что __get вызывается только один раз при попытке доступа к $employee->age.

2 голосов
/ 20 февраля 2012

$name является свойством $employee, поэтому __get для него не вызывается: свойство читается напрямую.

Итак, __get вызывается один раз: для age.

2 голосов
/ 20 февраля 2012

__get() не вызывается при доступе к свойствам вашего объекта.Он запускается, когда вы читаете $employee->age (который не является существующим свойством вашего объекта)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...