摘要:
1.对象的数据结构非常简单 handle: 一次request期间对象的编号,每个对象都有一个唯一的编号,与创建先后顺序有关,主要在垃圾回收时用 ce: 所属类的zend_class_entry handlers: 这个保存的对象相关操作的一些函数指针,比如成员属性的读写、成员方法的获取、对象的销毁 阅读全文
摘要:
1.PHP中类编译阶段的产物,而对象是运行时产生的,它们归属于不同阶段。一个类可以包含有属于自己的常量、变量(称为“属性”)以及函数(称为“方法”)。 2.首先我们看下类的数据结构: create_object为实例化对象的操作,可以通过扩展自定义一个函数来接管实例化对象的操作,没有定义这个函数的话 阅读全文
摘要:
1. Zend引擎主要包含两个核心部分:编译、执行: 执行阶段主要用到的数据结构: opcode: php代码编译产生的zend虚拟机可识别的指令,php7有173个opcode,定义在 zend_vm_opcodes.hPHP中的所有语法实现都是由这些opcode组成的。 zend_op_arra 阅读全文
摘要:
1.函数 汇编中函数对应的是一组独立的汇编指令,然后通过call指令实现函数的调用。PHP编译的opcode数组,与汇编指令对应。 PHP用户自定义函数的实现就是将函数编译为独立的opcode数组,调用时分配独立的执行栈依次执行opcode,所以自定义函数对于zend而言并没有什么特别之处,只是将o 阅读全文
摘要:
1.php是解析型的高级语言,zend内核使用c语言实现,有main函数,php脚本就是输入,内核处理后输出结果,内核将php脚本翻译成c程序可识别的opcode就是php的编译。 c语言的编译将c代码编译成机器码,这些机器码就是操作指令,将指令写入二进制程序load相应的内存区(常量区 数据区 代 阅读全文
摘要:
1.静态变量的结构 php脚本编译之后会生成执行opcode组成的opcode_array,执行每个zend_op_array都会生成一个单独的zend_execute_data结构。 php的局部变量分配在zend_execute_data结构上,生命周期在opcoe_array执行开始分配,执行 阅读全文
摘要:
1.php的常量 就是一个简单的标识符,脚本执行期间不会改变,大小写敏感,默认大写。 常量的存储结构 flag代表的含义 : CONST_CS: 大小写敏感 CONST_PERSISTENT: 持久化的(只有通过扩展、内核定义的才支持,这种常量不会在request结束时清理掉) CONST_CT_S 阅读全文
摘要:
zval结构比较简单,内嵌一个union类型的zend_value保存具体变量类型的值或指针,zval中还有两个union:u1、u2: u1: 它的意义比较直观,变量的类型就通过u1.v.type区分,另外一个值type_flags为类型掩码,在变量的内存管理、gc机制中会用到,第三部分会详细分析 阅读全文