我想知道哪个在语义上和技术上最适合我的选择。我已经创建了一个简单的对象注册表类,但是对象访问的方法让我想知道什么是最好的。我目前正在使用第一个版本:
//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()
魔法,保持流利的语法。use()
。__invoke()
魔法,这已被提出,但我不太喜欢。我只是想知道是否有人有洞察力或建议使用任何(或没有)这些选项。在我的案例中使用Registry类的原因是提供关键对象的伪全球化,以便在嵌套闭包中使用(每次都用use
声明它们很麻烦)
这与我在PHP closures and implicit global variable scope
的其他问题有些相关提前致谢:)
答案 0 :(得分: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