我的会话类应该是静态的吗?

Und*_*ned 5 php session

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

我目前正在用PHP编写会话类来跟踪网站上的用户.

一个会话似乎在静态类中是有意义的,因为它们只会是其中之一吗?

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

谢谢!

ter*_*ško 4

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

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

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

class ObjectFactory
{

    protected $session;

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

$session = new Session;

$user = new User( $session );
$article = new Document( $session );
Run Code Online (Sandbox Code Playgroud)

现在,两个$user实例$article将共享同一个会话实例。

欲了解更多信息,请观看以下演示: