我已经在网络上的几个地方找到了下面的代码,甚至在Stack Overflow上也找到了,但是我无法绕过它。我知道它的作用,但即使有例子,我也不知道它是如何做到的。基本上它存储了值,但我不知道如何向注册表添加值。有人可以尝试解释这段代码是如何工作的,我是如何设置和检索它的值的?
class Registry {
private $vars = array();
public function __set($key, $val) {
$this->vars[$key] = $val;
}
public function __get($key) {
return $this->vars[$key];
}
}
答案 0 :(得分:8)
使用PHP在property overloading上进行黑客攻击,向私有$vars
数组添加条目并从中检索条目。
要添加属性,您可以使用...
$registry = new Registry;
$registry->foo = "foo";
在内部,这会通过魔术foo
方法向$vars
数组添加__set
键,字符串值为“foo”。
要检索值...
$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);
}
答案 1 :(得分:8)
您可能需要查看PHP.NET - Overloading
基本上,你会这样做......
$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);
希望这有帮助!