【问题标题】:Duplicating functions for late static binding复制后期静态绑定的函数
【发布时间】:2015-09-19 04:45:26
【问题描述】:

我试图了解后期静态绑定,并通过阅读几个堆栈溢出问题和手册,除了我不明白为什么,在我找到的所有示例中(包括手册) ,直接回显类名的方法在子类中重复。

我的理解是,从另一个类扩展而来的类会继承其父类的所有方法和属性。因此,为什么在后期静态绑定的PHP手册示例中重复了who()方法。我意识到没有它,父类会被回显,但无法理解为什么。

查看手册中的代码...

<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();
?>

为什么需要重写 who() 方法,我认为它必须是相同的?提前致谢。

【问题讨论】:

  • 一目了然,它看起来纯粹是为了显示哪个类的方法正在触发
  • 删除它并调用基类方法
  • 是的,因为您正在扩展类并覆盖方法。这是标准的 PHP OOP 行为。
  • 但是用与父类完全相同的方法覆盖该方法 - 这肯定已经被继承了?
  • 它们在内容上可能看起来相同,但在实现上却不同。它们也是不同的实例。这个特殊的例子is not specific to static methods.

标签: php mysql class late-static-binding


【解决方案1】:

Late static binding类似于虚方法调用,但它是静态的。

在 A 类中,方法测试调用 two()。 two() 必须显示“A”。 但是因为这类似于虚方法,所以会执行B::two()

这是几乎相同的代码,但我相信更清楚发生了什么:

<?php
class A {
    public static function process() {
        echo "AAAA";
    }
    public static function test() {
        static::process(); // Here comes Late Static Bindings
    }
}

class B extends A {
    public static function process() {
        echo "BBBB";
    }
}

B::test();

它在执行时打印BBBB

【讨论】:

  • 好的,这很有帮助。但是一个相关的问题 - 为什么带有 class 的方法回显不回显 B 类,除非它基本上在子类中被覆盖?
  • 不知道我是否理解-如果您不覆盖B中的方法,它将执行A::two(),无论您使用的是self::还是static::-这是静态方法的一般工作原理 - 它们属于它们“首先”实现的类
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2012-04-21
  • 2011-02-12
  • 2013-01-23
相关资源
最近更新 更多