1

我想知道我在这里的选择在语义和技术上是最优化的。我创建了一个简单的对象注册表类,但对象访问的方法让我想知道什么是最好的。我目前正在使用第一个变体:

//the Registry methods can chain, each returning a self reference
$registry = Registry::getInstance()->register('myObject', new Object);

//accessing a registered object method
//in various possible ways
Registry::getInstance()->myObject->method();        //1
Registry::getInstance()->use('myObject')->method(); //2
$registry('myObject')->method();                    //3
  • 第一个变体使用__get()魔法,保持流畅的语法。
  • 第二个使用' getter '方法use()
  • 第三个使用__invoke()魔法,有人建议过,但我不太喜欢。

我只是想知道是否有人对使用这些选项中的任何一个(或没有)有见解或建议。在我的例子中使用 Registry 类的原因是提供关键对象的伪全球化,用于嵌套闭包(use每次都声明它们很麻烦)

这与我的另一个问题有些相关,在PHP 闭包和隐式全局变量范围

提前致谢 :)

4

1 回答 1

1

我个人的意见是结合使用您的第二个和第三个代码示例。使用两者(或仅使用您的第二个示例),您可以使用 phpDoc 来维护自动完成功能。

这是一个例子:

<?php

class Session {
    public function register() {
    }
}

/**
 * @property Session $session
 */
class Registry {
    private $_classes = array();

    public function __set($key, $value) {
        $key = (string) $key;
        if ((null === $value) && isset($this->_classes[$key])) {
            unset($this->_classes[$key]);
        } elseif (null !== $value) {
            $this->_classes[$key] = $value;
        }
    }

    public function __get($key) {
        $key = (string) $key;
        if (isset($this->_classes[$key])) {
            return $this->_classes[$key];
        }

        switch ($key) {
            case 'session':
                $this->_classes[$key] = new Session();
                break;
        }

        return $this->_classes[$key];
    }
}

$registry = new Registry();
$registry->session->register();

如果我应该给你一个提示,为什么我的注册表类不遵循单例模式......如果你想运行单元测试,请避免使用单例模式。见这里:http ://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

于 2011-07-25T08:57:04.967 回答