注册表模式静态变量

时间:2014-04-04 16:38:05

标签: php design-patterns

我目前面临着访问注册表模式功能所服务的类的静态成员的不便。 我想要使​​用的理想代码如下。它访问基类中的常量,该常量通过注册表类的静态方法get()提供。

echo "<link rel='shortcut icon' href='" . Registry::get('base')::SHORTCUT_ICON . "'>";

目前我只能像这样处理代码:

$base = Registry::get('base');
echo "<link rel='shortcut icon' href='" . $base::SHORTCUT_ICON . "'>";

我不确切地知道这个功能会被调用什么,但我认为在PHP 5.4中引入了类似的东西 - Access array returned by a function in php。在这里https://wiki.php.net/rfc/functionarraydereferencing

问题

这个问题是否有一个简洁的单线解决方案,还是必须保持凌乱的双线?

2 个答案:

答案 0 :(得分:1)

解决问题的一种非常简单的方法是创建一个方便的包装器来检索静态成员。如果您可以提供要环绕的实例,则包装器方法最有效。由于您有一个具有静态成员的类,因此您需要对Registry具有硬编码依赖性。除非你可以提供一个偏离实例的实例。

理想情况

class RegistryBaseWrapper {
    private $registry;

    public function __construct(Registry $registry) {
        $this->registry = $registry;
    }

    public function getShortcutIcon() {
        $base = $this->registry::get('base');
        return $base::SHORTCUT_ICON;
    }
}

$wrapper = new RegistryBaseWrapper($registry);
echo $wrapper->getShortcutIcon();

不太理想,但也可以使用

class RegistryBaseWrapper {
    public function getShortcutIcon() {
        $base = Registry->get('base');
        return $base::SHORTCUT_ICON;
    }
}

$wrapper = new RegistryBaseWrapper();
echo $wrapper->getShortcutIcon();

P.s。不要过分关注使用静态变量和直接类引用创建oneliner。它们将创建将来难以管理的依赖项。如果您正在为快速抛弃项目编写此代码,那么就可以了。如果这是一个需要未来工作的项目,请不要。

答案 1 :(得分:0)

我唯一能想到的就是:

constant(get_class(Registry::get('base')).':: SHORTCUT_ICON');

不确定这是一个更好的解决方案,因为可读性受到极大的影响。

您可能想要做的其他事情是在getClassName()类中创建一个Registry函数,该函数只返回类的名称。然后就可以了

constant(Registry::getClassName('base').':: SHORTCUT_ICON')

更清楚一点。