Ian*_*oar 8 php oop design-patterns
我已经在网络上的几个地方找到了下面的代码,甚至在Stack Overflow上也找到了,但我无法绕过它.我知道它的作用,但我不知道它是如何做到的,即使是这些例子.基本上它存储值,但我不知道如何向注册表添加值.有人可以尝试解释这段代码是如何工作的,我是如何设置和检索它的值的?
class Registry {
private $vars = array();
public function __set($key, $val) {
$this->vars[$key] = $val;
}
public function __get($key) {
return $this->vars[$key];
}
}
Run Code Online (Sandbox Code Playgroud)
它使用PHP的黑客入侵属性重载来向私有$vars数组添加条目并从私有数组中检索条目.
要添加属性,您将使用...
$registry = new Registry;
$registry->foo = "foo";
Run Code Online (Sandbox Code Playgroud)
在内部,这将增加一个foo关键$vars通过魔术字符串值"foo"的排列__set方法.
要检索一个值......
$foo = $registry->foo;
Run Code Online (Sandbox Code Playgroud)
在内部,这将通过魔术方法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);
}
Run Code Online (Sandbox Code Playgroud)
您可能想要查看PHP.NET - 重载
基本上,你会......
$Registry = new Registry();
$Registry->a = 'a'; //Woo I'm using __set
echo $Registry->a; //Wooo! I'm using __get
Run Code Online (Sandbox Code Playgroud)
所以在这里,我正在使用__set($a, 'This value is not visible to the scope or nonexistent')
另外,我正在使用__get($a);
希望这有帮助!