使new self()
使用当前实例的构造函数的正确方法是什么?换句话说,当我这样做时:
class Foo{
function create(){
return new self();
}
}
Class Bar extends Foo{
}
$b = new Bar();
echo get_class($b->create());
我希望看到:Bar
代替:Foo
答案 0 :(得分:2)
class Foo{
function create(){
$c = get_class($this);
return new $c();
}
}
Class Bar extends Foo{
}
$b = new Bar();
echo get_class($b->create());
将类类型存储在临时变量中,然后返回它的新实例。
答案 1 :(得分:1)
public static function create()
{
$class = get_called_class();
return new $class();
}
这应该有用。
class Foo{
public static function create()
{
$class = get_called_class();
return new $class();
}
}
class Bar extends Foo{
}
$a = Foo::create();
$b = Bar::create();
echo get_class($a), PHP_EOL, get_class($b);
节目:
Foo Bar
<强> UPD:强>
如果你想要非静力学,那么:
<?php
class Foo{
public function create()
{
$class = get_class($this);
return new $class();
}
}
class Bar extends Foo{}
$a = new Bar();
$b = $a->create();
echo get_class($a), PHP_EOL, get_class($b);
?>
节目:
Bar Bar
答案 2 :(得分:0)
Class Bar extends Foo {
function create(){
return self;
}}
如果你从子类中调用一个函数,那么它是否会搜索最近的父级来调用它。这是继承。
这个想法是在这种情况下使用多态。从子项重新声明一个函数会覆盖它的父项活动。如果你想运行它的父函数,那么你必须像parent::callee();