• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lml12377
V2EX  ›  程序员

private 继承中的 $this 问题

  •  
  •   lml12377 · Sep 12, 2016 · 1971 views
    This topic created in 3541 days ago, the information mentioned may be changed or developed.
    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 replies    2016-09-12 22:31:29 +08:00
    vus520
        1
    vus520  
       Sep 12, 2016   ❤️ 1
    final private function testPrivate()
    {
    echo 'base private' . '<br>';
    }

    很显然,这里不是默认的 final
    bombless
        2
    bombless  
       Sep 12, 2016   ❤️ 1
    3p 不是可见性,是可访问性

    说的想起来我们悲剧的 pub/non-pub 影响可见性的 use 语句设计(捂脸
    SoloCompany
        3
    SoloCompany  
       Sep 12, 2016   ❤️ 1
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3615 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 04:56 · PVG 12:56 · LAX 21:56 · JFK 00:56
    ♥ Do have faith in what you're doing.