PHP的面向对象 延迟绑定

walden 发布于 2013/02/22 09:48
阅读 384
收藏 0
PHP

NGINX社区官方微服务训练营,深入了解K8s网络,线上课程+专家答疑,立即加入>>>

class A{
    private    $var1;                                //public  protected和private  结果不一样
    public function __construct(){
        $this->var1 = 'A';
    }
    public function display(){
    //var_dump($this);
        var_dump($this->var1);
    }
}


class B extends A{
    public $var1;
    public function __construct(){
        parent::__construct();
        $this->var1 = 'B';
    }
    public function display2(){
        parent::display();
        var_dump($this->var1);
    }
}


我以前提过这个问题 也跟OSC上的一些高人探讨过 但是今天回头看了一下 还是有一些疑惑 所以想再次跟高手们探讨探讨

我现在的问题是这样的

在class A的display方法里打印$this:var_dump($this)
脚本执行后 这个$this 是class B的实例 这是毋庸置疑的 因为执行入口是$b->display2() 若$var1是private属性 经class B继承 成为不可访问属性 也就是说 现在$this是B的实例 其中有一个不可访问的$var1和一个可以访问的$var1 没有覆盖关系 这样 $this->var1应该是‘B’才对 而结果却是‘A’ 

这不是很奇怪吗

加载中
0
酒逍遥
酒逍遥

我执行的结果 输出 是 A  B  啊

有什么问题么?

parent::display();   这句表示执行父类的display方法.所以在display方法里this 指向的是 A不是B

酒逍遥
酒逍遥
回复 @华定平 : 呵呵,不客气.我也学习了很多.
walden
walden
该评论暂时无法显示,详情咨询 QQ 群:点此入群
酒逍遥
酒逍遥
回复 @华定平 : 嗯.从源头找原因是最快的
walden
walden
回复 @酒逍遥 : 嗯 C++中就是这样的 因为是public继承的话 private被继承后就是不可访问成员 而protected 和 public被继承后访问权限不变 C++还有私有继承和保护继承 C++的面向对象复杂得多 我推测 PHP的继承只相当于C++中的公有继承 而让我疑惑的是 $this->var1为何会因 $var1的权限不同而改变 看来只能看PHP的源码才能知晓其中缘由了
酒逍遥
酒逍遥
回复 @华定平 : 哦 想起来了..定义为 private 的属性 只能被类自己访问. 子类是无法访问到这个属性的.protected 的属性则可以被子类访问.public类型的属性则可以在任意地方被访问
下一页
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部