what means new static?
我在一些框架中看到了这行代码:
1
| return new static($view, $data); |
你怎么理解new static?
- 这是什么框架?
- 例如Laravel,但我发现只有在核心中,而不是在使用它们的API时
- 查看此页了解更多信息;stackoverflow.com/questions/5197300/new-self-vs-new-static
- PHP后期静态绑定
- @阿伦达:这就像是decltype(*this)的多态性失效?多么可怕的关键词用法!
- @lightness"决定不引入新的关键字,而是使用已经保留的static".php.net/manual/en/language.oop5.late-static-bindings.php
- 就我所知,它只是调用当前类的构造函数
- @喂,如果您指的是使用static的类或它的当前子类,那么是的。
- @不,它和decltype(*this)完全一样。禁用多态性的版本是new self。
- @Jon Fyi,decltype已经"禁用多态性"。作为一个静态结构,在我看来就像是static。self将是一个采用RTTI的版本。
- @jon stackoverflow.com/q/15899369/560648
- @轻量赛马Sinorbit:嗯,我自己从来没有用过decltype,所以我会继续你之前的评论。"decltype(*this)与多态性禁用"意味着通常"decltype(*this)"是多态性启用。
- @乔恩:我错了。:)
- 恕我直言,我不明白这个问题怎么会是另一个问题的复制品。另一个问题询问相对于新自我的新静态,而这个问题询问独立于任何其他语言结构的新静态。对我来说,在问题的清晰性和理解力上有明显的区别。
在类的成员函数中编写new self()时,会得到该类的一个实例。这就是self关键字的魔力。
所以:
1 2 3 4 5 6 7 8
| class Foo
{
public static function baz() {
return new self();
}
}
$x = Foo::baz(); // $x is now a `Foo` |
即使您使用的静态限定符用于派生类,也会得到一个Foo:
1 2 3 4 5
| class Bar extends Foo
{
}
$z = Bar::baz(); // $z is now a `Foo` |
如果要启用多态性(在某种意义上),并让PHP注意您使用的限定符,可以将self关键字替换为static关键字:
1 2 3 4 5 6 7 8 9 10 11 12
| 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的其他更传统的用法混淆。
- hmm.。很快:new static()-返回当前类的对象,不管扩展了哪个类,new self()-返回声明或扩展该方法的类中的对象(函数的最后一个版本)…我明白吗?
- @你好:基本上。
- 是的,对我来说已经足够了)即使基本上)
- (不——反过来说!)