PHP中的注册表类是否会像这样工作?

时间:2010-01-23 21:25:01

标签: php registry

如果我创建一个注册表对象来存储其他对象和设置,就像这样...

$registry = Registry::getInstance();

然后创建另外两个对象并将Registry对象传递给它们,如下所示......

$core = new core($registry);
$database = Database::getInstance($registry);

然后在脚本中我将一些对象添加到Registry对象...

// Store some Objects into our Registry object using a Registry Pattern
$registry->storeObject("database", $database);
$registry->storeObject("session", $session);
$registry->storeObject("cache", $cache);
$registry->storeObject("user", $user);

在顶层创建的核心和数据库对象中的方法是否仍然可以访问我存储到注册表中的所有对象,即使在创建核心和数据库对象之后其他对象存储到注册表中?

4 个答案:

答案 0 :(得分:1)

如果它与对象的实例相同,则为yes - 否则它们必须使用共享内存来传递对象或不传递对象,否则您将无法访问它们。

但是,我想你的注册表是单身对吗?是的。

编辑:也许我不理解你的问题......

答案 1 :(得分:1)

是的,对象通过引用传递(在php> = 5中),因此,每个变量都将引用相同的底层对象。

在旧的PHP中,你需要通过ref:

$obj->registry =& $registry;

function f(& $registry) { // $registry is a reference }

php< 5中的键是分配和函数声明时的&符语法。

答案 2 :(得分:1)

是的,他们可以访问这些对象,但IMO Registry不是最好的解决方案 - 上下文会好得多,因为它允许你为每个属性建模。它还让您100%确定当您致电$registry->get('user')时,将返回一些User对象。

Context与Registry非常相似:

class Context {
    protected $database;
    protected $user;
    protected $logger;

    public function setDatabse(PDO $database) {
       $this->database = $database;
    }

    public function getDatabase() {
       return $this->database;
    }

    public function setLogger(Logger $logger) {
       if ($logger instanceof MySpecificLogger) {
          // do sth
       }

       $this->logger = $logger;
    }

    // rest of setters/getters
}

以后再使用时:

$db = $contextObject->getDatabase();

当你使用Registry时,你没有100%确定$ db是PDO的对象(在这个例子中)可能会在某些情况下导致一些问题。

答案 3 :(得分:0)

不,默认情况下不是。几乎在每种情况下,参数都以PHP的值传递。您想要的是“通过引用传递”,您可以阅读更多关于in the manual的内容。