V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lml12377
V2EX  ›  程序员

private 继承中的 $this 问题

  •  
  •   lml12377 · 2016-09-12 17:29:06 +08:00 · 1627 次点击
    这是一个创建于 3026 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 是什么时候确定下来的呢?

    3 条回复    2016-09-12 22:31:29 +08:00
    vus520
        1
    vus520  
       2016-09-12 17:41:29 +08:00   ❤️ 1
    final private function testPrivate()
    {
    echo 'base private' . '<br>';
    }

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

    说的想起来我们悲剧的 pub/non-pub 影响可见性的 use 语句设计(捂脸
    SoloCompany
        3
    SoloCompany  
       2016-09-12 22:31:29 +08:00   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3092 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:14 · PVG 21:14 · LAX 05:14 · JFK 08:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.