Шаблон реестра PHP - PullRequest
       3

Шаблон реестра PHP

8 голосов
/ 16 ноября 2011

Я нашел фрагмент кода ниже в нескольких местах в Интернете и даже здесь, в Переполнении стека, но я просто не могу обернуть его вокруг. Я знаю, что он делает, но я не знаю, как это происходит, даже с примерами. По сути, он хранит значения, но я не знаю, как добавить значения в реестр. Может кто-нибудь попытаться объяснить, как работает этот код, как установить и извлечь из него значения?

class Registry {

    private $vars = array();

    public function __set($key, $val) {
        $this->vars[$key] = $val;
    }

    public function __get($key) {
        return $this->vars[$key];
    }
}

Ответы [ 2 ]

8 голосов
/ 16 ноября 2011

Возможно, вы захотите проверить PHP.NET - Перегрузка

По сути, вы бы сделали ...

$Registry = new Registry();

$Registry->a = 'a'; //Woo I'm using __set
echo $Registry->a; //Wooo! I'm using __get

Так вот, я использую __set($a, 'This value is not visible to the scope or nonexistent') Также я пользуюсь __get($a);

Надеюсь, это помогло!

8 голосов
/ 16 ноября 2011

Он использует взломанный PHP на перегрузке свойства , чтобы добавлять записи и извлекать записи из частного $vars массива.

Чтобы добавить свойство, вы должны использовать ...

$registry = new Registry;
$registry->foo = "foo";

Внутренне это добавит ключ foo к массиву $vars со строковым значением "foo" с помощью магического метода __set.

Чтобы получить значение ...

$foo = $registry->foo;

Внутренне это приведет к извлечению записи foo из массива $vars с помощью магического метода __get.

Метод __get действительно должен проверять наличие-существующие записи и обрабатывать такие вещи.Код как есть вызовет ошибку E_NOTICE для неопределенного индекса.

Лучшей версией может быть

public function __get($key)
{
    if (array_key_exists($key, $this->vars)) {
        return $this->vars[$key];
    }

    // key does not exist, either return a default
    return null;

    // or throw an exception
    throw new OutOfBoundsException($key);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...