Я нашел фрагмент кода в нескольких местах по всему Интернету и даже здесь, в Stack Overflow, но я просто не могу обернуть его вокруг. Я знаю, что он делает, но я не знаю, как это происходит даже с примерами. В основном это сохранение значений, но я не знаю, как добавить значения в реестр. Может ли кто-нибудь попытаться объяснить, как работает этот код, и как я устанавливаю и извлекаю из него значения?
class Registry { private $vars = array(); public function __set($key, $val) { $this->vars[$key] = $val; } public function __get($key) { return $this->vars[$key]; } }
Он использует PHP, взломанный при перегрузке свойств, чтобы добавлять записи и извлекать записи из частного массива $vars
.
Чтобы добавить свойство, вы должны использовать …
$registry = new Registry; $registry->foo = "foo";
Внутри это добавило бы ключ foo
в массив $vars
со строковым значением «foo» с помощью магического метода __set
.
Чтобы получить значение …
$foo = $registry->foo;
Внутренне это приведет к извлечению записи foo
из массива $vars
помощью магического метода __get
.
Метод __get
действительно должен проверять несуществующие записи и обрабатывать такие вещи. Код as-is вызывает ошибку 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); }
Возможно, вы захотите проверить 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);
Надеюсь, это помогло!