Недавно я ходил на собеседование, и мой код, который я предоставил, имел волшебные функции для получения и установки переменных. Мой код был следующим:
public function __get($name){
try {
return $this->$name;
} catch (Exception $e) {
throw new Exception('Trying to get a variable "'.$name.'" that does not exist.');
}
}
В интервью парень спросил меня о видимости моих переменных, у меня были установлены частные, но теперь они были доступны с помощью магических функций. По сути, я провалил интервью по этому вопросу, поэтому я хотел понять больше. Я следил за учебником от PHP Master и нашел другой __get
, я пытался сломать его, но, похоже, он работает, но странным образом.
Я вызываю __get('test')
, чтобы получить мою переменную _test
, но если для нее установлено значение private, она снова вызывает себя и сообщает мне, что не может получить доступ __test
. Я не очень понимаю, почему он снова звонит сам себе.
public function __get($name)
{
$field = '_' . strtolower($name);
if (!property_exists($this, $field)){
throw new \InvalidArgumentException(
"Getting the field '$field' is not valid for this entity"
);
}
$accessor = 'get' . ucfirst(strtolower($name));
return (method_exists($this, $accessor) && is_callable(array($this, $accessor))) ?
$this->$accessor() : $this->$field;
}
Кто-нибудь может подсказать, как правильно использовать __get и __set при использовании видимости в классе и почему эта функция снова вызывает сама себя.
Я читал другие сообщения здесь, но я все еще борюсь с этой концепцией.