php - 我的 session 类应该是静态的吗?

标签 php session

我总是被告知在创建静态类时要非常小心,因为它们很容易被不太熟练的程序员过度使用。

我目前正在用 PHP 编写一个 session 类来跟踪网站上的用户。

一个 session 似乎在一个静态类中是有意义的,因为永远只会是其中一个,对吗?

我曾经在一个 CMS 中工作,该 CMS 有一个工厂,该工厂创建了一个 session 对象,但随后存储了该实例,并且每当请求一个新 session ( MyFactory::getSession() )时,它都会返回先前初始化的 session 。这样做有什么好处吗?

谢谢!

最佳答案

不,如果您正在进行面向对象的编程,则类绝不应该是静态的。这也适用于工厂。静态工厂方法模式(您在示例中展示的)被认为是一种不良做法,因为它违反了 SRP .

静态变量只是具有不同名称的全局变量,静态方法是命名空间函数,其中命名空间恰好看起来像类。

如果您需要多个对象来使用同一个 session 实例,那么您应该为它们提供所有对象。直接或使用工厂。

class ObjectFactory
{

    protected $session;

    public function __construct( $session )
    {
        $this->session = $session;
    }

    public function create( $name ) 
    {
        return new $name( $this->session );
    }

}

您将此工厂的实例传递给任何需要创建结构并使用 session 的对象。您只需使用该工厂创建对象,它们都将使用相同的 session 实例进行初始化。

在更简化的示例中,您可以手动将 session 传递给每个对象:

$session = new Session;

$user = new User( $session );
$article = new Document( $session );

$user$article 实例现在将共享同一个 session 实例。

有关更多信息,请观看以下演示:

关于php - 我的 session 类应该是静态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12115671/

相关文章:

php - PHP 中什么更快,单引号还是双引号?

php - 特定国家/地区的 Magento 产品

node.js - Express cookieSession 不填充 req.session

php - 从 Windows 迁移到 Linux 服务器,现在出现 session 错误

javascript - 访问 jQuery 文件中的 PHP session 变量

javascript - 在一个脚本中自动刷新和自动上下滚动

php - 我可以在 javascript 中使用 php 吗?

PHP/MySQL : Date lower than today

node.js - Flash 消息不适用于 connect-session-sequelize

apache - 协议(protocol)从 https 切换到 http 时出现 Cookie 和 Session id 问题