При имитации свойств с помощью методов __get и __set всегда нужно помнить, что реально таких свойств не существует. Но использовать ваш класс может и другой программист, и имитированные свойства могут быть приняты им за реально существующие. Казалось бы, в этом нет ничего плохого, но при попытке проверить наличие имитированного свойства при помощи функции isset можно получить неожиданный результат:
$p = new Squere(10); // наличие свойства area в классе Squere имитировано var_dump(isset($p->area)); // bool(false)
Чтобы избежать подобных недоразумений существует магический метод __isset, который вызывается при попытке проверить наличие недоступного или несуществующего свойства с помощью функции isset. Возвращаемое методом __isset логическое значение и говорит, следует ли считать свойство существующим.
Добавим реализацию метода __isset в класс Squere:
public function __isset($name) { if ($name == 'area') { return true; } return false; }
Теперь функция isset возвращает ожидаемый результат:
$p = new Squere(10); var_dump(isset($p->area)); // bool(true)