这个PHP问题与这个问题有关,但有点不同。我有一个名为
create()
的静态工厂方法,它实例化一个类实例。我希望该方法在运行时动态地实例化调用它的(子)类的实例。因此,在运行时必须确定要实例化的类。但是我希望在子类中不重新定义静态工厂方法来实现这一点(在我的示例中这是完全有效的,因为子类没有新的数据成员需要初始化)。这是否有可能?class Foo {
private $name;
public static function create($name) {
//HERE INSTED OF:
return new Foo($name);
//I WANT SOMETHING LIKE:
//return new get_class($this)($name);//doesn't work
//return self($this);//doesn't work either
}
private function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
// the following class has no private data, just extra methods:
class SubFoo extends Foo {
public function getHelloName() {
echo "Hello, ", $this->getName(), ".\n";
}
}
$foo = Foo::create("Joe");
echo $foo->getName(), "\n"; // MUST OUTPUT: Joe
$subFoo = SubFoo::create("Joe");
echo $subFoo->getHelloName(), "\n"; // MUST OUTPUT: Hello, Joe.
SubFoo
,所以要了解关于后期状态绑定的知识... 还有一个问题点。static
也不错。 - Piotr Olaszewskistatic
而不是self
。 - Kamil Karkusget_called_class()
相比于static
有什么优势呢?谢谢。 - John Sondersonget_called_class()
可以用于检索调用类的名称字符串,但static
创建对象。 - Piotr Olaszewski