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