PHP 中 $this 在继承时引发的问题?

kinra
  • 16
<?php

class Super
{
    // 私有方法 printHello
    private function printHello() {
        echo get_called_class() . ' hello' . PHP_EOL;
    }

    // 声明一个公有方法,调用上面的私有方法 printHello
    public function printTest() {
        var_dump(get_class($this));
        var_dump(get_class_methods($this));
        $this->printHello();
    }
}

class child extends Super
{ 
    // 本人了解 private 方法不会被继承,知道此方法不与父类的私有的同名方法printHello()构成重写关系。
    public function printHello() {
        echo "阿凡提de小毛驴";
    }
}

$super = new Super();
echo $super->printTest();
echo '------------------------------------'.PHP_EOL;
$child = new child();
echo $child->printTest();

结果输出:

string(5) "Super"
array(2) {
  [0] =>
  string(10) "printHello"
  [1] =>
  string(9) "printTest"
}
Super hello
------------------------------------
string(5) "child"
array(2) {
  [0] =>
  string(10) "printHello"
  [1] =>
  string(9) "printTest"
}
child hello

$child->printTest() 输出的为什么不走子类的 printHello() 方法?子类对象不是无法访问父类的私有方法吗?求大神指点一二,实在没整明白。

回复
阅读 521
2 个回答
✓ 已被采纳

分析相关问题的其他回答后,我得到了合理的解释。
php 的私有方法会在编译的时候静态绑定,也就是说编译时,调用私有函数的语句,会被私有函数的函数体替换。虽然没有找到php静态绑定的概念,但参考java中的静态绑定概念,php底层实现应该是差不多的。这样也能合理的解释这个问题了。
有兴趣的可以参考以下链接的内容:
php继承相关的一个问题
PHP静态绑定与动态绑定
Java中的静态绑定与动态绑定

此处考察的是 private|protected|public 的区别
父类的 printHello 是 private 的,所以在调用$this->printHello(),只能调用父类的方法。
若要调用子类的方法,可以改用 protected 和 public 。

你知道吗?

宣传栏