Видимость PHP с помощью магических методов __get & __set

Недавно я ходил на собеседование, и мой код, который я предоставил, имел волшебные функции для получения и установки переменных. Мой код был следующим:

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 при использовании видимости в классе и почему эта функция снова вызывает сама себя.

Я читал другие сообщения здесь, но я все еще борюсь с этой концепцией.

5
задан MrWhite 28 January 2014 в 20:08
поделиться