因为我注意到这是我不断重新实现的模式,所以我创建了一个DataContainer类,它覆盖__set
,__get
,__isset
,__unset
和实现ArrayAccess
,Countable
,IteratorAggregate
和Serializable
例如,以MVC方式呈现PHP模板的View类继承自DataContainer,因此它重载了对提供给模板的数据的访问权。
现在,我发现自己想要创建一个Session类来抽象PHP的低级会话处理。我发现这个Session类几乎可以完成DataContainer所做的一切,事实上,是一个 DataContainer - 它保存数据。
但是,如果我从DataContainer继承,那么所有重载的调用都会转到它的private $_data
数组。当然,我可以覆盖DataContainer的public get($key)
,public set($key,$val)
等方法,但我唯一要做的就是将$this->_data
重命名为$_SESSION
。
是否可以将变量设置为对$_SESSION
等特殊全局的引用?
class Session extends DataContainer {
//singleton stuff
private function __construct() {
$this->_data =& $_SESSION;
}
}
这样做甚至是好主意吗?如果没有,你有什么建议?
答案 0 :(得分:1)
我当然希望这是个好主意,因为我经常使用它。 Decorator
的种类,仅适用于变量容器。是的,它已经工作了大约3年了,而且我非常喜欢验证&它可以在更复杂的项目上产生跟踪功能。请记住,您不能强制任何其他代码来使用容器而不是$_SESSION
,但是当大多数代码使用其他方法时,对该特定字符串的项目范围搜索会产生快速结果。
对于那些项目不适合正确的依赖注入路径,无论是大小,时间还是历史原因,我也将其设为Singleton
。引用Session::instance()
与$_SESSION
超全局一样简单。
答案 1 :(得分:1)
是否可以将变量设置为 参考一个特殊的全球性 $ _SESSION?
是的,$this->_data =& $_SESSION;
这样做甚至是个好主意吗?
我不明白为什么不这样做,有人可能会说通过引用将数据传递给构造函数可能更好,这样它就可以用于任何数组而不仅仅是session。
因此,是的。
编辑:作为一个侧面点,记住你并不总是有一个会话,有时你在cli等上运行,我个人有自己的会话对象(只是像你这样的DataContainer)然后我会在需要的地方坚持$ _SESSION ,或文件或.. - 即我在$ _SESSION中保存(有状态)会话对象,而不是使用$ _SESSION作为会话数据,如果这是有意义的..