Php 阻止独立类实例化,从工厂启用

Php 阻止独立类实例化,从工厂启用,php,Php,我想禁用一个要由new操作符实例化的类,但让我们假设一个getObject方法创建并返回它的实例。这可行吗 我想禁用要由新操作符实例化的类 一种常见的方法是将构造函数私有化 class Example { private function __construct() { } } 以下操作将导致致命错误 $object = new Example(); 虽然这会起作用,但我鼓励你们和未来的读者进行回顾 更新: 上面的代码满足了这个要求:类不能使用new实例化,需要使用工厂方法g

我想禁用一个要由new操作符实例化的类,但让我们假设一个getObject方法创建并返回它的实例。这可行吗

我想禁用要由新操作符实例化的类

一种常见的方法是将构造函数私有化

class Example {
    private function __construct() {
    }
}
以下操作将导致致命错误

$object = new Example();
虽然这会起作用,但我鼓励你们和未来的读者进行回顾

更新:

上面的代码满足了这个要求:类不能使用new实例化,需要使用工厂方法getObject来创建对象。然而,OP没有说明他们需要这种构造的原因

出现这种设计有几个原因;其中之一是当类型C的对象的创建需要通过一些初始化来完成时,不管出于什么原因,这些初始化无法在类的构造函数中完成

class Example {
    private function __construct() {
    }
}
采用这种方式构造C类对象的另一个原因是单例设计模式;这实际上是一种反模式,但这是另一种讨论;为了实现单例,类C应该如下所示:

    class C    
    {
        private static $instance = NULL;

        protected function __construct()
        {
        }

        public static function getObject()
        {
            if (! isset(self::$instance)) {
                self::$instance = new self();
            }
            return self::$instance;
        }
    }
不管是单例还是非单例,因为方法getObject是静态的,所以测试框架不能对其进行存根或模拟,必须使用其原始实现。此外,因为这是创建类C对象的唯一方法,所以不能单独测试使用该类的其他类

总之,即使施工是可能的,也不推荐。使用语言机制强制创建C类的对象使该类成为测试其他使用它的类的麻烦


如果由于复杂的初始化,类C的对象的创建需要通过某个方法完成,那么更好的方法是使用Builder设计模式。使它成为另一个类生成器的非静态方法,并指示使用类文档的程序员不要使用new直接创建类C的对象。这样它就不会影响其他类的可测试性。

注意,每次调用getObject时都会返回一个新的C对象,这可能不是所有读卡器的预期行为。这个问题没有单例限制。它只是说禁止使用new创建,强制使用工厂方法。我承认细节是魔鬼。我关心的是未来的读者,因为这个问题虽然看似简单,但却是一个滑坡。无论如何,这不是一个非常有用的答案。现在评论中的解释比答案中的解释要多。堆栈溢出不是代码转储™ :}更新了答案;添加了Singleton类的代码,以及关于使用或更好地说不使用问题中要求的设计的一些想法。您的答案缺少factory方法。参见@axiac的答案getObject@Paul萨西克,我知道。我的回答故意只针对问题的第一部分,以鼓励未来的读者更多地了解这种模式的含义。