__get не вызывается, если __set не вызывается, однако код работает?

Вот мой код:

<?php

class SampleClass {

    public function __get($name){
        echo "get called";
        echo $name;
    }

    public function __set($name, $value) {
        echo "set called";
    }

}

?>

И мой индексный файл:

$object = new SampleClass();
$object->color = "black";
echo $object->color;

Если я запускаю этот код как есть, вот вывод:

установить по имени

Однако, если я закомментирую

public function __set($name, $value) {
    echo "set called";
}

часть выше (только эта часть), тогда вывод будет:

черный

Так что здесь произошло?

2 ответа

Решение

Это объяснение того, что происходит. В вашем первом примере. Вы никогда не сохраняли значение в объекте, и при этом объявленное свойство не существовало. Это, echo $object->color; на самом деле никогда ничего не делает, так как ничего не возвращается __get,

Во втором примере вы присвоили значение свойству вашего объекта. Поскольку вы не объявили свойство в вашем объекте, оно создается по умолчанию как public. Так как его публика, __get никогда не вызывается при доступе к нему.

__get будет вызываться только если свойство не существует. Удаляя __set, вы создаете свойство при настройке, поэтому вместо вызова __getphp просто возвращает свойство.

Простой способ думать о том, что __get а также __set являются обработчиками ошибок - они включаются, когда php не может удовлетворить ваш запрос.

Другие вопросы по тегам