private 继承中的 $this 问题

2016-09-12 17:29:06 +08:00
 lml12377
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 的继承:

zend_do_inheritance

貌似继承是在编译阶段确定下来的?是不是意思是:并没有所谓的内含的父类对象,仅仅是子类把父类的代码按照可见性合到了一起?( static 延迟绑定暂不讨论),假如是这样的话,$this 是什么时候确定下来的呢?

1628 次点击
所在节点    程序员
3 条回复
vus520
2016-09-12 17:41:29 +08:00
final private function testPrivate()
{
echo 'base private' . '<br>';
}

很显然,这里不是默认的 final
bombless
2016-09-12 18:06:43 +08:00
3p 不是可见性,是可访问性

说的想起来我们悲剧的 pub/non-pub 影响可见性的 use 语句设计(捂脸
SoloCompany
2016-09-12 22:31:29 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/305728

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX