PHP注册表模式

时间:2011-11-16 05:38:41

标签: 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];
    }
}

2 个答案:

答案 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);

希望这有帮助!