__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
, вы создаете свойство при настройке, поэтому вместо вызова __get
php просто возвращает свойство.
Простой способ думать о том, что __get
а также __set
являются обработчиками ошибок - они включаются, когда php не может удовлетворить ваш запрос.