PHP:别名$ _SESSION变量

时间:2010-07-22 20:28:34

标签: php

因为我注意到这是我不断重新实现的模式,所以我创建了一个DataContainer类,它覆盖__set__get__isset__unset和实现ArrayAccessCountableIteratorAggregateSerializable

例如,以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;
    }
}

这样做甚至是好主意吗?如果没有,你有什么建议?

2 个答案:

答案 0 :(得分:1)

我当然希望这是个好主意,因为我经常使用它。 Decorator的种类,仅适用于变量容器。是的,它已经工作了大约3年了,而且我非常喜欢验证&它可以在更复杂的项目上产生跟踪功能。请记住,您不能强制任何其他代码来使用容器而不是$_SESSION,但是当大多数代码使用其他方法时,对该特定字符串的项目范围搜索会产生快速结果。

对于那些项目不适合正确的依赖注入路径,无论是大小,时间还是历史原因,我也将其设为Singleton。引用Session::instance()$_SESSION超全局一样简单。

答案 1 :(得分:1)

  

是否可以将变量设置为   参考一个特殊的全球性   $ _SESSION?

是的,$this->_data =& $_SESSION;

  

这样做甚至是个好主意吗?

我不明白为什么不这样做,有人可能会说通过引用将数据传递给构造函数可能更好,这样它就可以用于任何数组而不仅仅是session。

因此,是的。

编辑:作为一个侧面点,记住你并不总是有一个会话,有时你在cli等上运行,我个人有自己的会话对象(只是像你这样的DataContainer)然后我会在需要的地方坚持$ _SESSION ,或文件或.. - 即我在$ _SESSION中保存(有状态)会话对象,而不是使用$ _SESSION作为会话数据,如果这是有意义的..