关于标准的问题。
我已经为PHP会话管理创建了一个包装类,它有助于根据访问它的某些内部模块自动组织会话数据。它被设计为单例,使用getInstance()
方法进行实例化,因为在给定时间只有一个会话。此外,这对我有利,因为我能够阻止session_start()
失败的(虽然可能是有限的)机会中的会话对象的实例化。至于一个例子:
public static function getInstance(){
if(!self::$_instance || !session_id()){
if(session_start()){
self::$_instance = new self(session_id());
}else{
return;
}
}
return self::$_instance;
}
我的问题是;虽然使用网关getInstance()
方法在这里工作原理有几个原因,但是在类中实现公共静态getInstance()
或create()
方法以控制对象创建是常见/良好的做法,如果对象依赖于外部条件?
我发现自己坚持在单例的情况下提供getInstance()
的约定,在多个实例对象的情况下提供create()
。
TL; DR:我一直使用getInstance()
和create()
方法来控制所有对象实例化。我做错了吗?
编辑:稍微提炼我的问题;除了使用getInstance()
作为单身人士之外,我的构造函数是否包含create()
方法,用于更少目的,更倾向于不良约定?我应该从真正的构造函数中抛出异常,还是继续从create()
返回false?
答案 0 :(得分:2)
单身人士通常被认为是“坏人”;请参阅this section here了解该主题的火焰战争。
也就是说,使用工厂方法或工厂类来创建对象通常被认为是好的,所以你在那里很好:)
我个人使用symfony dependency injection组件(可以在不使用symfony框架的情况下安装在任何项目中)来简化依赖注入并避免看起来合适的单例。
我仍然使用一些单身,这对我来说很有意义;例如,记录器和工厂对象对我来说自然是单身,所以我就这样做了。我认为全球功能(例如工厂)很好,但全球州很糟糕,我相信。
关于是否抛出异常或是否从create()调用返回false的修正问题;这取决于您的应用程序是否可以在没有创建对象的情况下成功继续。例如,如果您要创建创建页面所需的数据库连接,则抛出异常。如果你做的事情不那么重要,那就回复假并继续你的快乐方式:)
答案 1 :(得分:0)
getInstance()
用于Zend框架中的所有地方,这是我对代码中的标准和约定的认可。
对于create(),如何使用魔术__construct
方法,以便在new Blah()
时调用该类的__construct
方法?
答案 2 :(得分:0)
您应该使用__construct
方法然后使用create方法。
当__construct
本身被调用时,您可以在构造函数中执行初始化和其他操作。
另一个好处是你可以忘记调用create()方法,你的对象可能处于不一致状态