我个人的意见是结合使用你的第二和第三个代码示例。使用这两种方法(或者只使用第二个示例),您可以使用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();
如果我能告诉你为什么我的注册表类不遵循singleton模式。。。如果要运行单元测试,请避免使用singleton模式。请看这里:
http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html