PHP 对象继承的机制

  1. 看yii源码时候,在看run方法的时候 ,有一个handleRequest方法,写在baseApplication,调用他的this指得是webApplication ,对此产生了疑问 。上网查了PHP对象继承,$this指向问题。如下
  2. https://zhidao.baidu.com/question/558306279.html
  3. https://www.oschina.net/question/1259433_125564?sort=time&p=1
  4. https://blog.csdn.net/dyw_666666/article/details/79782995
  5. https://blog.csdn.net/u013756836/article/details/106565012/?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-7  (通过源码分析的,源码现在看不懂,有机会在研究,把其中一部分复制出来方便查看
  6. 当类存在继承关系时,操作方式是:将属性从父类复制到子类 。子类会将父类的公共、受保护的属性值数组全部合并到子类中,然后将全部属性的zend_property_info哈希表也合并到子类中。合并非静态属性default_properties_table: 首先申请一个父类+子类非静态属性大小的数组,然后先将父类非静态属性复制到新数组,然后再将子类的非静态数组接着父类属性的位置复制过去,子类的default_properties_table指向合并后的新数组,default_properties_count更新为新数组的大小,最后将子类旧的数组释放。
  7. 父类属性不与子类冲突 且 父类属性是私有: 即父类属性为private,且子类中没有重名的,则将此属性插入子类properties_info,但是更新其flag为ZEND_ACC_SHADOW,这种属性将不能被子类使用;
    父类属性不与子类冲突 且 父类属性是公有: 这种比较简单,子类可以继承使用,直接插入子类properties_info;
    父类属性与子类冲突 且 父类属性为私有: 不继承父类的,以子类原属性为准,但是打上ZEND_ACC_CHANGED的flag,这种属性父子类隔离,互不干扰;
    父类属性与子类冲突 且 父类属性是公有或受保护的:
    父子类属性一个是静态一个是非静态: 编译错误;
    父子类属性都是非静态: 用父类的offset,但是值用子类的,父子类共享;
    父子类属性都是静态: 不继承父类属性,以子类原属性为准,父子类隔离,互不干扰;

猜你喜欢

转载自www.cnblogs.com/bneglect/p/13178527.html