我目前面临着访问注册表模式功能所服务的类的静态成员的不便。
我想要使用的理想代码如下。它访问基类中的常量,该常量通过注册表类的静态方法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
问题
这个问题是否有一个简洁的单线解决方案,还是必须保持凌乱的双线?
答案 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')
更清楚一点。