首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >封装PHP会话

问封装PHP会话
EN

Stack Overflow用户
提问于 2016-02-12 09:41:13
回答 2查看 182关注 0票数 0

我的一位同事搬到了另一家公司,我得到了他现有项目的源代码。我很震惊代码看起来是如此的凌乱。我不是一个PHP开发人员,所以这也许是一个愚蠢的问题,但在我看来,他使用$_SESSION太多了,而且我们在会话方面有很多错误。我想知道封装$_SESSION并为他使用自己的方法的每个值编写是否会更好。

我在这段代码中看到的问题是,他使用了这样的会话对象

代码语言:javascript
复制
$_SESSION['customer']['items'] = getItems() //returns an array
$_SESSION['article'][$Id]['name'] = utf8_decode[$received[1]];

所以从我的角度来看,我会把他所有的东西都储存在简单的Popos中,然后把它们放到会话中。

所以给顾客的波波应该是这样的

代码语言:javascript
复制
class CustomerPopo
{

    private $_id;

    private $_salutation;

    private $_name;

    private $_surename;

        public function getId()
    {
        return $this->_id;
    }

    public function setId($value)
    {
        $this->_id = $value;
    }

    public function getSalutation()
    {
        return $this->_salutation;
    }

    public function setSalutation($value)
    {
        $this->_salutation = $value;
    }

    public function getName()
    {
        return $this->_name;
    }

    public function setName($value)
    {
        $this->_name = $value;
    }

    public function getSurename()
    {
        return $this->_surename;
    }

    public function setSurename($value)
    {
        $this->_surename = $value;
    }

    function CustomerPopo() {

    }
}

我想象SessionManager是这样的

代码语言:javascript
复制
class SessionManager
{

    private static function getValue($valueName)
    {
        $value = SessionManager::getValueFromSession($valueName);
        if (is_null($value)) {
             //Handle stuff and do further checks
        }
        return $value;
    }

    private static function getValueFromSession($valueName)
    {
        $value = null;
        if (isset($_SESSION[$valueName])) {
            $value = $_SESSION[$valueName];
        }
        return $value;
    }

    private static function setValue($valueName, $value)
    {
        $_SESSION[$valueName] = $value;
    }

    private static function clearValue($valueName)
    {
        if (isset($_SESSION[$valueName])) {
            unset($_SESSION[$valueName]);
        }
    }

    public static function getCustomer()
    {
        $customer = '';
        try {
            $customer = SessionManager::getValue('customer');
        } catch (Exception $e) {
            $customer = '';
        }
        return $customer;
    }

    public static function setCustomer($customer)
    {
        SessionManager::setValue('customer', $customer);
    }
}

有了这个,我可以消除一些错误,这些错误产生于customer/Customer/cusomter这个词的不同拼写。我想SessionManager会变大,因为代码中有~30个会话变量。

是否有一种我可以遵循的设计模式来实现这样一个SessionManager,而不让它最终变得更糟?如前所述,我对PHP还不太熟悉。

编辑

由于这种方法似乎是有效的,我如何处理我提到的30个会话变量?如果我有一个集合/获取,并且可能对每个值都有一个清晰的方法,那么我将得到60-90个方法。

EN

回答 2

Stack Overflow用户

发布于 2016-02-12 09:52:53

让一个对象封装对全局变量(如$_SERVER、$_GET、$_POST或$_SESSION )的访问,就像在您的示例中一样,这是一个好主意。在MVC架构中这样做是很普遍的做法。

类应该有IDE完成的方法吗?这实际上取决于您,但在我工作的工作场所,通常的做法是不使用它们,而是使用字段的const字符串标识符,这些字段随后习惯于通过一个对象(如您的SessionManager )在全局$_SESSION变量中指定索引。

但即使这样,我也可能放弃静态方法,转而使用管理器的一个实例。使用静态方法的类可能会防止输入错误,但不会修复全局状态问题,在单元测试应用程序时,这可能是一个很大的问题。

票数 1
EN

Stack Overflow用户

发布于 2016-02-12 09:57:13

我完全同意像你的大学那样使用$_SESSION是很麻烦的,因为你很难弄清楚会话中到底存储了什么。

在我看来,CustomerPopo是一个非常好的主意,因为它非常容易理解可用的数据。另外,IDE将能够理解它,并将这些信息作为代码完成和检查提供给您。

我也喜欢您的SessionManager,但是我会尝试摆脱这些getValue/setValue函数,然后移动像getCustomer/setCustomer这样的详细函数。我想您不是在使用PHP框架。我认为您应该看看它们,它们非常方便(例如Symfony或Yii2)。

最后一件事:始终记住,存储在会话对象中的所有数据都将为每个请求加载和解析,但是如果您使用它或不使用它。因此,如果您只为特定请求存储了大量数据,您应该考虑使用其他地方来存储它,比如外部缓存。此外,会话引入了状态,如果可能的话,您应该避免这种状态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35359245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档