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;
Если я запущу этот код как есть, вот результат:
set calledget calledcolor
Однако, если я закомментирую
public function __set($name, $value) {
echo "set called";
}
Часть выше (только эта часть), тогда вывод будет:
black
Так что же здесь произошло?
2 answers
Это объяснение того, что происходит. В вашем первом примере. Вы никогда не сохраняли значение внутри объекта, и объявленное свойство не существовало. Это, echo $object->color;
на самом деле никогда ничего не делает, так как ничего не возвращается из __get
.
Во втором примере вы присвоили значение свойству в своем объекте. Поскольку вы не объявили свойство в своем объекте, оно создается по умолчанию как общедоступное. Поскольку он общедоступен, __get
никогда не вызывается при доступе к нему.
__get
будет вызываться только в том случае, если свойство не существует. Удаляя __set
, вы создаете свойство при настройке, поэтому вместо вызова __get
php просто возвращает свойство.
Простой способ подумать об этом заключается в том, что __get
и __set
являются обработчиками ошибок - они срабатывают, когда php не может иначе выполнить ваш запрос.