PHP: self:: vs parent:: with extends
我想知道在静态子类扩展静态父类(例如)时,使用self::和parent::有什么区别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Parent {
public static function foo() {
echo 'foo';
}
}
class Child extends Parent {
public static function func() {
self::foo();
}
public static function func2() {
parent::foo();
}
} |
func()和func2()之间有什么区别吗?如果有,那是什么?
谢谢你
当做
- 如果在子类中有overriddenfoo(),那么self::foo()调用子类版本,而parent::foo()调用原始父版本。
- +1,应该是答案
- static::foo()让它更有趣:)
- 好的,但是如果子类没有自己的foo()定义,那么这是否意味着两个调用之间没有区别,即self::和parent::?
- 如果子类没有被重写的foo(),那么它将执行父类foo()代码….调用有区别,但执行的不同。调用parent::foo()将始终执行父类foo()方法,即使子类重写它;调用self::foo()将执行foo()重写(如果它存在于self中,即子类中),否则如果不存在重写,则将执行父类foo()。
- 谢谢,那有什么不同呢?结果会完全一样?我理解self::和parent::之间的区别,但不是在上面的上下文中:)
1 2 3 4 5 6 7 8 9
| Child has foo() Parent has foo()
self::foo() YES YES Child foo() is executed
parent::foo() YES YES Parent foo() is executed
self::foo() YES NO Child foo() is executed
parent::foo() YES NO ERROR
self::foo() NO YES Parent foo() is executed
parent::foo() NO YES Parent foo() is executed
self::foo() NO NO ERROR
parent::foo() NO NO ERROR |
如果您正在寻找适合他们使用的正确案例。parent允许访问继承的类,而self是对运行方法(静态或其他)所属的类的引用。
在php中使用singleton模式时,self关键字的一个流行用法是,self不尊重子类,而static使用新的self与新的static。
parent提供了访问继承类方法的能力,如果需要保留一些默认功能,通常很有用。
- 谢谢,现在假设child没有自己的foo()并且永远不会这样,那么场景5和6在使用self::或parent::keywords方面有什么区别?是否有或可以互换使用?我的问题只涉及这些特定的场景。谢谢
- 我承认失败!你赢了!如果你能做出那些生硬的保证,并且你不只是试图混淆其他任何关注你的代码的人(包括你自己在6个月内),那么在执行什么方面就没有区别,如果你真的,真的想,你可以互换使用它们!
- 好吧,PHP是一个双爪锤…
- 感谢Mark,为了不混淆任何人,对于这些场景有没有更好的版本?我认为parent::foo()更具解释性。你的方法是什么?谢谢你
- 我可能会采用的方法是使用后期静态绑定,并使用static::foo(),除非我特别想强制调用parent::foo()……这允许我在孩子中实现foo(),如果我将来希望这样做…甚至进一步扩大儿童班…虽然很多问题归结为具体的需求
self用于调用静态函数和操作静态变量,这些变量是特定于类而不是特定于对象的。