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的主要内容,如果未能解决你的问题,请参考以下文章