PHP注册表模式

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)

Phi*_*hil 8

它使用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)


Man*_*dez 8

您可能想要查看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);

希望这有帮助!