PHP: self:: vs parent:: with extends

Posted

技术标签:

【中文标题】PHP: self:: vs parent:: with extends【英文标题】: 【发布时间】:2014-01-20 03:14:14 【问题描述】:

我想知道当静态子类扩展静态父类时使用 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() 之间有什么区别吗?如果有,那是什么?

谢谢

问候

【问题讨论】:

如果子类中有overridden foo(),那么self::foo() 调用子类版本,而parent::foo() 调用原始父类版本 +1,应该是答案 static::foo() 让它更有趣:) 好的,但是如果 Child 类没有自己的 foo() 定义,那么这是否意味着两个调用之间没有区别,即 self:: 和 parent:: ? 如果子类没有覆盖foo(),那么它会执行父类foo() 代码....调用有所不同,但执行的内容没有区别。调用parent::foo() 将始终执行父类的 foo() 方法,即使子类覆盖它;调用 self::foo() 将执行 foo() 覆盖,如果它存在于 self(即子),否则它将执行父 foo() 如果不存在覆盖 【参考方案1】:
                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 支持 New self vs. new static

parent 提供了访问继承的类方法的能力,如果您需要保留一些默认功能,这通常很有用。

【讨论】:

谢谢,现在让我们假设 Child 没有自己的 foo() 并且永远不会那么在使用 self:: 或 parent:: 关键字方面,场景 5 和 6 有什么区别?有没有或者可以互换使用?我的问题仅涉及这些特定情况。谢谢 我认输!你赢了!如果您可以做出这些铁定的保证,并且您不只是试图混淆查看您的代码的其他任何人(包括您自己在 6 个月的时间内),那么执行的内容没有区别,您可以使用它们如果你真的,真的想可以互换! 谢谢马克,为了不让任何人感到困惑,这些场景有更好的版本吗?我想 parent::foo() 更具解释性。你的方法是什么?谢谢 我可能会采取的方法是利用后期静态绑定,并使用static::foo(),除非我特别想强制调用parent::foo()...。这允许我实现一个foo () 在孩子中我是否希望将来这样做......甚至进一步扩展子类......虽然很多都归结为特定要求【参考方案2】:

self 用于调用静态函数和操作静态变量,这些静态变量是特定于类而不是特定于对象的。

【讨论】:

以上是关于PHP: self:: vs parent:: with extends的主要内容,如果未能解决你的问题,请参考以下文章

php中self,this, parent 详解

PHP中this,self,parent的区别

PHP中this,self,parent的区别

PHP中this,self,parent的区别

关于php中self与this parent关键字的用法

php中的publicprotectedprivate三种访问控制模式及self和parent的区别(转)