Php 注册表模式静态变量

Php 注册表模式静态变量,php,design-patterns,Php,Design Patterns,我目前面临着访问注册表模式函数服务的类的静态成员的不便。 下面是我想要使用的理想代码。它访问基类中的常量,该常量通过注册表类的静态方法get()提供 echo "<link rel='shortcut icon' href='" . Registry::get('base')::SHORTCUT_ICON . "'>"; echo”“; 目前,我只能这样处理代码: $base = Registry::get('base'); echo "<link rel='shortcu

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

echo "<link rel='shortcut icon' href='" . Registry::get('base')::SHORTCUT_ICON . "'>";
echo”“;
目前,我只能这样处理代码:

$base = Registry::get('base');
echo "<link rel='shortcut icon' href='" . $base::SHORTCUT_ICON . "'>";
$base=Registry::get('base');
回声“;
我不知道这个特性的确切名称,但是我认为PHP5.4-中也引入了类似的功能。这里呢

问题

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();

是否有一个简单的单行线解决方案来解决这个问题,还是必须保持一个混乱的两行线?

我唯一能想到的是:

constant(get_class(Registry::get('base')).':: SHORTCUT_ICON');
不过,我不确定这是一个更好的解决方案,因为可读性受到了极大的影响

您可能还需要在
注册表
类中创建一个
getClassName()
函数,该函数只返回类的名称。那你就可以了

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

这一点更加清楚。

解决这个问题的一个非常简单的方法是创建一个方便的包装器来检索静态成员。如果可以提供一个实例进行包装,那么包装器方法最有效。由于您有一个具有静态成员的类,因此您需要对
注册表
具有硬编码依赖关系。除非你能提供一个偏离航线的实例

理想状态

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。它们将创建将来很难管理的依赖项。如果您正在为一个快速扔掉的项目编写此代码,那么它就可以了。如果这是一个需要未来工作的项目,请不要这样做。

非常感谢您的努力,这绝对是一个方便的技巧,但我仍然不认为这是我想要的。可读性确实受到了影响,我正在寻找更多的PHP语言结构,而不是一个黑客围绕它。它看起来似乎还不存在:(再次感谢!为什么不在基值周围创建一个简单的包装器来检索静态属性?@Bart您能给我看一行代码,您可以用来从通过静态函数返回的类中检索常量吗?PHP似乎不接受两个静态访问器(:)在一个语句或表达式中…非常感谢您提供了有用的答案。我将开始使用包装器类:)