我想使用私有构造函数实现以下内容。
问题是get_class()
返回ParentBase
;虽然; get_called_class()
返回ChildClass
。
如何从调用类上下文而不是基类上下文中调用 __construct()?
会有很多子类,所以我只想要一个共享工厂方法,而且我还想确保一个子类不能被扩展(这样就不能用 new 关键字创建它)。
似乎应该有一种方法可以ChildClass::createObject()
使用私有ChildClass
构造函数和公共ParentBase
工厂方法。
<?php
class ParentBase
{
public static function createObject()
{
echo get_class() . "<br/>"; // prints ParentBase
echo get_called_class() . "<br/>"; // prints ChildClass
return new static();
}
}
class ChildClass extends ParentBase
{
private $greeting = "bye";
private function __construct()
{
$this->greeting = "hi";
}
public function greet()
{
echo $this->greeting;
}
}
$child = ChildClass::createObject();
$child->greet();
上面的输出是:
ParentBase
ChildClass
Fatal error: Call to private ChildClass::__construct() from context 'ParentBase'
受保护的构造函数工作: http ://codepad.viper-7.com/sCgJwA
私有构造函数没有: http ://codepad.viper-7.com/YBs7Iz