【问题标题】:Calling inherited method confusion调用继承方法混淆
【发布时间】:2015-09-18 14:00:35
【问题描述】:

有人能解释一下为什么我会得到如下结果吗? (看看 cmets)。

class A {
    public function foo() {         // foo from B
    //private function foo() {      // foo from A
        echo "foo from A</br>";
    }
    public function test() {
        $this->foo();
    }
}

class B extends A {
    public function foo() {
        echo "foo from B</br>";
    }
}

$b = new B();
$b->test();

我不应该总是得到“foo from B”而“this”指向 B 类对象吗?

【问题讨论】:

  • 你得到了什么结果?当我在这里运行脚本时,输出是foo from B&lt;/br&gt;,正如预期的那样。
  • 如果 'foo()` 函数通过 'protected' 或 'public' 限定符对子类可用,那么它会按预期工作。但是,它会在接口或抽象类中明确。在之前的情况下,foo()private,那么您将不会在任何可用的地方提及它。

标签: php


【解决方案1】:

因为$this使用的是后期绑定方式,

阅读有关绑定的官方文档(静态或非静态无关紧要)

http://php.net/manual/en/language.oop5.late-static-bindings.php

【讨论】:

  • 是的,我已经阅读了数千次官方文档,但我无法理解他们的解释。那么你能用你的方式解释一下这个案子吗?
  • 后期绑定意味着后期(最后)扩展类
  • 这么晚(最后一个)扩展类是B?
  • 所以 $this 在测试方法中冷藏到 B 类,这就是为什么结果是“来自 B 的 foo”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2011-12-30
  • 1970-01-01
  • 2011-04-25
  • 2016-05-13
相关资源
最近更新 更多