PHP:self::vs parent::with extends
我想知道当静态子类扩展静态父类时,使用self::和parent::有什么区别PHP:self::vs parent::with extends,php,class,static,parent,self,Php,Class,Static,Parent,Self,我想知道当静态子类扩展静态父类时,使用self::和parent::有什么区别 class Parent { public static function foo() { echo 'foo'; } } class Child extends Parent { public static function func() { self::foo(); } public static function func2() {
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()之间有什么区别吗?如果有,那是什么区别
多谢各位
问候
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
是对运行该方法(静态或其他)的类的引用
self
关键字的一个常用用法是在PHP中使用单例模式时,self
不支持子类,而static
支持子类
parent
提供了访问继承类方法的能力,如果需要保留某些默认功能,这通常很有用。self用于调用静态函数和操作静态变量,这些变量是特定于类而非特定于对象的。如果您在子类中重写了foo(),然后self::foo()
调用子类版本,而parent::foo()
调用原始父类版本+1,应该是answerstatic::foo()
更有趣:)OK,但如果子类没有自己的foo()定义那么这是否意味着两个调用(即self::和parent::)之间没有区别?如果子类没有被重写的foo()
,那么它将执行父类foo()
code。。。。调用有区别,但执行的内容没有区别。调用parent::foo()
将始终执行父类foo()方法,即使子类重写它;调用self::foo()将执行foo()覆盖,如果它存在于self中(即子对象),否则它将执行父对象foo(),如果不存在覆盖hanks,现在让我们假设子对象没有自己的foo(),并且永远不会,那么场景5和场景6在使用self::或parent::关键字方面有什么区别?是否有其他方法或它们可以互换使用?我的问题只涉及这些特殊情况。谢谢,我承认失败!你赢了!如果您能够做出这些铁一般的保证,并且您不只是试图混淆其他查看您的代码的人(包括您自己在6个月的时间内),那么执行的内容就没有区别,如果您真的、真的想要的话,您可以互换地使用它们!谢谢马克,为了不让任何人感到困惑,这些场景有没有更好的版本?我认为parent::foo()更具解释性。你的方法是什么?谢谢,我可能会采用的方法是使用后期静态绑定,并使用static::foo()
,除非我特别想强制调用parent::foo()
。。。。这使我能够在将来希望在孩子中实现foo()。。。甚至为了进一步扩展儿童课程。。。虽然很多都归结为特定的需求