【问题标题】:PHP: self:: vs parent:: with extendsPHP: 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() 如果不存在覆盖

标签: php class static parent self


【解决方案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 用于调用静态函数和操作静态变量,这些静态变量是特定于类而不是特定于对象的。

【讨论】:

    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 2013-10-29
    • 2012-05-07
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多