PHP-шаблон реестра
Я нашел фрагмент кода в нескольких местах по всему Интернету и даже здесь, в Stack Overflow, но я просто не могу обернуть его вокруг. Я знаю, что он делает, но я не знаю, как это происходит даже с примерами. В основном это сохранение значений, но я не знаю, как добавить значения в реестр. Может ли кто-нибудь попытаться объяснить, как работает этот код, и как я устанавливаю и извлекаю из него значения?
class Registry { private $vars = array(); public function __set($key, $val) { $this->vars[$key] = $val; } public function __get($key) { return $this->vars[$key]; } }
2 Solutions collect form web for “PHP-шаблон реестра”
Он использует 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);
Надеюсь, это помогло!