预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共52页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

学习视频网:http://www.xxspw.com编写PHPExtensionzhangdongjin@baidu.com目录目录2一、基础知识41.1PHP变量的存储41.1.1zval结构41.1.2引用计数51.1.3zval状态51.1.4zval状态切换61.1.5参数传递91.2HashTable结构91.2.1数据结构101.2.2PHP数组131.2.3变量符号表141.3内存和文件15二、Extensions的编写172.1HelloWorld172.1.1声明导出函数192.1.2声明导出函数块202.1.3填写模块信息212.1.4实现导出函数232.2使用参数242.2.1标准方法252.2.2底层方法272.2.3引用传递292.2.4编译检查(TODO)302.3返回值302.3.1返回引用312.4启动和终止函数332.5调用PHP函数342.6访问PHP变量372.6.1设置372.6.2获取382.6.3常量392.7输出信息42三、高级主题433.1使用数组433.1.1关联数组元素433.1.2非关联数组元素443.2使用资源453.2.1注册资源类型453.2.2注册资源463.2.3获取资源473.2.4维护引用计数48四、类和对象(TODO)50附录A.Extension的编译51附录B.Extension的加载过程52基础知识本章简要介绍一些Zend引擎的内部机制,这些知识和Extensions密切相关,同时也可以帮助我们写出更加高效的PHP代码。PHP变量的存储zval结构Zend使用zval结构来存储PHP变量的值,该结构如下所示:typedefunion_zvalue_value{longlval;/*longvalue*/doubledval;/*doublevalue*/struct{char*val;intlen;}str;HashTable*ht;/*hashtablevalue*/zend_object_valueobj;}zvalue_value;struct_zval_struct{/*Variableinformation*/zvalue_valuevalue;/*value*/zend_uintrefcount;zend_uchartype;/*activetype*/zend_ucharis_ref;};typedefstruct_zval_structzval;Zend根据type值来决定访问value的哪个成员,可用值如下:IS_NULLN/AIS_LONG对应value.lvalIS_DOUBLE对应value.dvalIS_STRING对应value.strIS_ARRAY对应value.htIS_OBJECT对应value.objIS_BOOL对应value.lval.IS_RESOURCE对应value.lval根据这个表格可以发现两个有意思的地方:首先是PHP的数组其实就是一个HashTable,这就解释了为什么PHP能够支持关联数组了;其次,Resource就是一个long值,它里面存放的通常是个指针、一个内部数组的index或者其它什么只有创建者自己才知道的东西,可以将其视作一个handle。引用计数引用计数在垃圾收集、内存池以及字符串等地方应用广泛,Zend就实现了典型的引用计数。多个PHP变量可以通过引用计数机制来共享同一份zval,zval中剩余的两个成员is_ref和refcount就用来支持这种共享。很明显,refcount用于计数,当增减引用时,这个值也相应的递增和递减,一旦减到零,Zend就会回收该zval。那么is_ref呢?zval状态在PHP中,变量有两种——引用和非引用的,它们在Zend中都是采用引用计数的方式存储的。对于非引用型变量,要求变量间互不相干,修改一个变量时,不能影响到其他变量,采用Copy-On-Write机制即可解决这种冲突——当试图写入一个变量时,Zend若发现该变量指向的zval被多个变量共享,则为其复制一份refcount为1的zval,并递减原zval的refcount,这个过程称为“zval分离”。然而,对于引用型变量,其要求和非引用型相反,引用赋值的变量间必须是捆绑的,修改一个变量就修改了所有捆绑变量。可见,有必要指出当前zval的状态,以分别应对这两种情况,is_ref就是这个目的,它指出了当前所有指向该zval的变量是否是采用引用赋值的——要么全是引用,要么全不是。此时再修改一个变量,只有当发现其zval的is_ref为0,即非引用时,Zend才会执行Copy-On-Write。zval状态切换当在一个zval上进行的所有赋值操作都是引用或者都是非引用时,一个is_ref就足够应付了