如何实例化具有私有构造函数的类。?
我不想在类中使用任何函数来创建自己的实例。
Ex class是:
class Test extends Test2 implements Test3 {
private function __construct () {
}
function doDisplay() {
}
function Docall() {
}
}
答案 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)
好吧,如果您不想在类中使用(静态)方法来创建实例,我想您的问题的答案就是:您不能。