访问子对象的语法选择
问题描述:
我想知道哪里是我的选择在语义和技术上最优化。我创建了一个简单的对象注册表类,但对象访问方法让我想知道什么是最好的。我目前使用的第一个变化:访问子对象的语法选择
//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()
魔法,有人建议,但我不太喜欢。
我只是想知道,如果任何人有洞察力,或建议使用任何(或不使用)这些选项。在我的情况下使用注册表类的原因是提供伪关键对象的全球化,用于嵌套关闭(声明它们与use
每次都很麻烦)
这有点与我的另一个问题有关,在PHP closures and implicit global variable scope
感谢提前:)
答
我个人的意见是使用你的第二个和第三个代码示例的组合。同时使用(或者只有你的第二个例子),你可以使用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
另一个相当不错的选择是实现ArrayAccess接口,所以你可以使用'$ registry ['myObject'] - > method();'。但是,为了提高效率,如果要对其执行多个操作,则需要缓存'myObject',例如'$ myObject = $ registry ['myObject'];' – connec 2011-03-27 14:46:34