<?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() 方法?子类对象不是无法访问父类的私有方法吗?求大神指点一二,实在没整明白。
分析相关问题的其他回答后,我得到了合理的解释。
php 的私有方法会在编译的时候静态绑定,也就是说编译时,调用私有函数的语句,会被私有函数的函数体替换。虽然没有找到php静态绑定的概念,但参考java中的静态绑定概念,php底层实现应该是差不多的。这样也能合理的解释这个问题了。
有兴趣的可以参考以下链接的内容:
php继承相关的一个问题
PHP静态绑定与动态绑定
Java中的静态绑定与动态绑定