PHP自()与当前对象的构造(php self() with current object'

2019-10-29 04:43发布

什么是正确的方式来获得new self()使用当前实例的构造? 换句话说,当我这样做:

class Foo{
  function create(){
    return new self();
  }
}

Class Bar extends Foo{
}

$b = new Bar();
echo get_class($b->create());

我想看看: Bar ,而不是: Foo

Answer 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


Answer 2:

class Foo{
  function create(){
    $c = get_class($this);
    return new $c();
  }
}

Class Bar extends Foo{
}

$b = new Bar();
echo get_class($b->create());

存储类类型的临时变量,然后返回它的一个新的实例。



Answer 3:

Class Bar extends Foo {
function create(){
return self;
}}

如果从子类调用一个函数,那么,如果将搜索最近的父调用它。 这是继承。

我们的想法是在这种情况下使用多态。 重新声明从孩子重写的功能它的父的活动。 如果你想运行它的父功能太多,那么你必须调用它parent::callee();



文章来源: php self() with current object's constructor