class base
{
public function test()
{
$this->testPublic();
$this->testProtected();
$this->testPrivate();
}
public function testPublic()
{
echo 'base public' . '<br>';
}
protected function testProtected()
{
echo 'base protected' . '<br>';
}
private function testPrivate()
{
echo 'base private' . '<br>';
}
}
class Ext extends base
{
public function testPublic()
{
echo 'ext public' . '<br>';
}
protected function testProtected()
{
echo 'ext protected' . '<br>';
}
private function testPrivate()
{
echo 'ext private' . '<br>';
}
}
(new Ext())->test();
输出
ext public
ext protected
base private
public / protected 应该很好理解,直接被覆盖掉了。
但是这个 private 有点疑问,首先 private 默认是 final 是不可以被覆盖的,但是按照继承的原则,是可以被继承的(只是子类的代码不能访问),另外 $this 是指向的调用者( Ext 对象),那这个 $this 该如何理解?
看 Thinking in java ,里面说子类初始化出对象时,会在内部默认创建一个父类的对象,毕竟是权威写的,但是找了很久,有个比较有说服力的是父类并没有创建一个对象(假设父类是 abstract 该如何创建对象?),而只是父类 .class 的 hash key 。
另外翻了翻 php 的 extend 实现的源码, function 的继承:
貌似继承是在编译阶段确定下来的?是不是意思是:并没有所谓的内含的父类对象,仅仅是子类把父类的代码按照可见性合到了一起?( static 延迟绑定暂不讨论),假如是这样的话,$this 是什么时候确定下来的呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.