我在一些框架中看到了这行代码:
return new static($view, $data);
你怎么理解的new static
?
当您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 注意到您使用的限定符,您可以将关键字交换self
为static
关键字:
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
。