PHP:self::vs parent::with extends

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() {

我想知道当静态子类扩展静态父类时,使用self::和parent::有什么区别

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,应该是answer
static::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()。。。甚至为了进一步扩展儿童课程。。。虽然很多都归结为特定的需求