PHP:类构造函数的标准,用于防止实例化

时间:2010-11-30 05:54:44

标签: php design-patterns session singleton

关于标准的问题。

我已经为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?

3 个答案:

答案 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()方法,你的对象可能处于不一致状态

相关问题