我一直被告知在创建静态类时要非常小心,因为他们倾向于被不太熟练的程序员过度使用。
我目前正在用PHP编写会话类来跟踪网站上的用户。
一个会话似乎在静态类中是有意义的,因为它们中只有一个是正确的吗?
我曾经在CMS中工作,该工厂创建了一个会话对象,然后存储了实例,当请求新会话时(MyFactory :: getSession()),它将返回先前初始化的会话。这有什么好处吗?
谢谢!
答案 0 :(得分:4)
不,如果您正在进行面向对象的编程,那么类永远不会是静态的。这也适用于工厂。静态工厂方法模式(您在示例中显示)被视为不良做法,因为它违反了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
个实例现在将共享同一个会话实例。
有关详细信息,请观看以下演示文稿: