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

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

Author: halfer, 2013-01-29

2 answers

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

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

 3
Author: datasage, 2013-01-28 21:42:09

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

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

 4
Author: troelskn, 2013-01-29 08:13:24