我如何实例化一个具有私有构造函数的类

时间:2011-07-06 05:42:03

标签: php

如何实例化具有私有构造函数的类。?

我不想在类中使用任何函数来创建自己的实例。

Ex class是:

class Test extends Test2 implements Test3 {
   private function __construct () {
   }

   function doDisplay() {
   }

   function Docall() {
   }
}

5 个答案:

答案 0 :(得分:6)

您无法在类本身内的任何位置调用私有构造函数,因此 使用外部可访问的静态方法来创建实例。

此外,如果Test2的构造函数不是私有的,则无法将Test::__construct()设为私有。

答案 1 :(得分:5)

您无法从构造函数为private的课程(实际课程大纲中)中实例化对象。

如果您打算使用它的功能,那么您应该将它们设为static并使用它们来满足您的需求。确保该功能是公开的。

例如:

<?php

class something
{
    private function __construct()
    {
        echo "something";
    }

    public static function display($msg)
    {
        echo $msg;
    }
}

something::display("Testing...");

?>

请参阅工作示例:http://codepad.org/VoYeyk8W

答案 2 :(得分:5)

您可以使用Reflection(PHP&gt; = 5.4)

进行实例化
class Test {

    private $a;

    private function __construct($a)
    {
        $this->a = $a;
    }
}

$class = new ReflectionClass(Test::class);
$constructor = $class->getConstructor();
$constructor->setAccessible(true);
$object = $class->newInstanceWithoutConstructor();
$constructor->invoke($object, 1);

它有效,但请记住,这不是该课程设计的用法,并且可能会产生一些无法预料的副作用。

答案 3 :(得分:1)

无论是谁设计这个类,都不希望你直接实例化,你不能做你想做的事。很可能原作者有充分的理由这样做,也许是内存管理或他想控制生命周期或停止线程问题,这可能有很多原因。

唯一明显的答案是重写源代码,使它们以您想要的方式工作,而不是试图打破别人的设计。或者你可以围绕这个类构建一个包装器,它隐藏了你不喜欢的部分,所以其余的代码都不必知道。

答案 4 :(得分:0)

好吧,如果您不想在类中使用(静态)方法来创建实例,我想您的问题的答案就是:您不能。