编程语言
首页 > 编程语言> > php – 我应该将superglobals存储为包装类’属性还是应该直接访问它?

php – 我应该将superglobals存储为包装类’属性还是应该直接访问它?

作者:互联网

我想为Session和Request创建一个包装器,这样我就不必直接访问PHP superglobals了.我意识到如果我为超级全局创建一个包装器并使用它们,单元测试我的应用程序会更容易,因为包装类可以被模拟.

在尝试创建我的包装类时,我研究了一些示例包装类.其中一些在初始化时将超全局存储为类属性:

class Session
{
    protected $vars;

    public function __construct()
    {
        session_start();

        // POINT OF INTEREST
        // Store the superglobal as a class property
        $this->vars = $_SESSION;
    }    

    public function get($index)
    {
        // POINT OF INTEREST
        // Accesses the class property instead of the superglobal
        return $this->vars[$index];
    }

    public function write($index, $value)
    {
        // Writes both class property and session variable
        $this->vars[$index] = $value;
        $_SESSION[$index] = $value;
    }
}

我的问题:有没有什么特别的原因为什么在创建包装类时我们将超全局存储为类’属性而不是直接访问它们?将上述代码与此对比:

class Session
{
    public function __construct()
    {
        session_start();
    }

    public function get($index)
    {
        // Accesses the superglobal directly
        return $_SESSION[$index];
    }

    public function write($index, $value)
    {
        // Accesses the superglobal directly
        $_SESSION[$index] = $value;
    }
}

IMO,因为包装类无论如何都会被嘲笑,为什么还要将超级全局存储为类属性呢?有这么多人这样做的原因有什么特别的吗?我应该将超级全局存储为包装器中的属性而不是直接访问它吗?

感谢您的任何意见.

解决方法:

我不认为有一些重要的原因,也许只是因为如果你改变后面提到的超全局,你就不必在你的类的整个代码中替换它,而只是在构造函数中.

从这个角度来看,我发现你提供的第一个实现的write方法并不是很明智,它会写出类属性和会话变量,正如你所说的那样.

然而,所有这些似乎都有点过分(并且过度思考).保持简单,做一些对你有用的事情.

标签:superglobals,php,unit-testing,phpunit
来源: https://codeday.me/bug/20190726/1543243.html