【问题标题】:Should my session class be static?我的会话类应该是静态的吗?
【发布时间】:2012-08-24 19:42:46
【问题描述】:

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

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

一个会话似乎在静态类中是有意义的,因为只有其中一个是正确的?

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

谢谢!

【问题讨论】:

  • 不,MyFactory::getSession() 没有多大意义,是的,使用静态类就可以了。
  • 如果您愿意,我认为您可以同时处理多个会话。
  • 为什么需要多个会话?
  • @Undefined ,您可能需要一个不同的会话包装器来实现相同的接口。如果您的代码与类的名称相关联(静态类就是这种情况),那么您无法替换会话实例“on fly”。这就是人们谈论紧密耦合代码时的意思。

标签: php session


【解决方案1】:

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

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

如果您需要多个对象来使用同一个会话实例,那么您应该将它们全部提供给它们。直接或使用工厂。

class ObjectFactory
{

    protected $session;

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

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

}

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

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

$session = new Session;

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多