75

我在一些框架中看到了这行代码:

return new static($view, $data);

你怎么理解的new static

4

1 回答 1

125

当您new self()在类的成员函数中编写代码时,您将获得该类的一个实例。这就是self关键字的魔力。

所以:

class Foo
{
   public static function baz() {
      return new self();
   }
}

$x = Foo::baz();  // $x is now a `Foo`

Foo即使您使用的静态限定符用于派生类,您也会得到:

class Bar extends Foo
{
}

$z = Bar::baz();  // $z is now a `Foo`

如果您想启用多态性(在某种意义上),并让 PHP 注意到您使用的限定符,您可以将关键字交换selfstatic关键字:

class Foo
{
   public static function baz() {
      return new static();
   }
}

class Bar extends Foo
{
}

$wow = Bar::baz();  // $wow is now a `Bar`, even though `baz()` is in base `Foo`

这可以通过称为后期静态绑定的 PHP 特性实现;不要将它与关键字的其他更常规用法混淆static

于 2013-04-09T10:05:11.593 回答