PHP内核介绍及扩展开发指南-基础知识.docx

PHP内核介绍及扩展开发指南-基础知识.docx

ID:51693067

大小:65.54 KB

页数:9页

时间:2020-03-15

PHP内核介绍及扩展开发指南-基础知识.docx_第1页
PHP内核介绍及扩展开发指南-基础知识.docx_第2页
PHP内核介绍及扩展开发指南-基础知识.docx_第3页
PHP内核介绍及扩展开发指南-基础知识.docx_第4页
PHP内核介绍及扩展开发指南-基础知识.docx_第5页
资源描述:

《PHP内核介绍及扩展开发指南-基础知识.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、一、基础知识本章简要介绍一些Zend引擎的内部机制,这些知识和Extensions密切相关,同时也可以帮助我们写出更加高效的PHP代码。1.1PHP变量的存储1.1.1zval结构Zend使用zval结构来存储PHP变量的值,该结构如下所示:viewsourceprint?01typedefunion_zvalue_value{02    longlval;             /*longvalue*/03    doubledval;               /*doublevalue*/04    struct{05       

2、 char*val;06        intlen;07    }str;08    HashTable*ht;             /*hashtablevalue*/09    zend_object_valueobj;10}zvalue_value;11  12struct_zval_struct{13    /*Variableinformation*/14    zvalue_valuevalue;    /*value*/15    zend_uintrefcount;16    zend_uchartype;        

3、   /*activetype*/17    zend_ucharis_ref;18};19  20typedefstruct_zval_structzval;21Zend根据type值来决定访问value的哪个成员,可用值如下:IS_NULLN/AIS_LONG对应value.lvalIS_DOUBLE对应value.dvalIS_STRING对应value.strIS_ARRAY对应value.htIS_OBJECT对应value.objIS_BOOL对应value.lval.IS_RESOU

4、RCE对应value.lval根据这个表格可以发现两个有意思的地方:首先是PHP的数组其实就是一个HashTable,这就解释了为什么PHP能够支持关联数组了;其次,Resource就是一个long值,它里面存放的通常是个指针、一个内部数组的index或者其它什么只有创建者自己才知道的东西,可以将其视作一个handle1.1.1引用计数引用计数在垃圾收集、内存池以及字符串等地方应用广泛,Zend就实现了典型的引用计数。多个PHP变量可以通过引用计数机制来共享同一份zval,zval中剩余的两个成员is_ref和refcount就用来支持这种共享

5、。很明显,refcount用于计数,当增减引用时,这个值也相应的递增和递减,一旦减到零,Zend就会回收该zval。那么is_ref呢?1.1.2zval状态在PHP中,变量有两种——引用和非引用的,它们在Zend中都是采用引用计数的方式存储的。对于非引用型变量,要求变量间互不相干,修改一个变量时,不能影响到其他变量,采用Copy-On-Write机制即可解决这种冲突——当试图写入一个变量时,Zend若发现该变量指向的zval被多个变量共享,则为其复制一份refcount为1的zval,并递减原zval的refcount,这个过程称为“zval

6、分离”。然而,对于引用型变量,其要求和非引用型相反,引用赋值的变量间必须是捆绑的,修改一个变量就修改了所有捆绑变量。可见,有必要指出当前zval的状态,以分别应对这两种情况,is_ref就是这个目的,它指出了当前所有指向该zval的变量是否是采用引用赋值的——要么全是引用,要么全不是。此时再修改一个变量,只有当发现其zval的is_ref为0,即非引用时,Zend才会执行Copy-On-Write。1.1.3zval状态切换当在一个zval上进行的所有赋值操作都是引用或者都是非引用时,一个is_ref就足够应付了。然而,世界总不会那么美好,PH

7、P无法对用户进行这种限制,当我们混合使用引用和非引用赋值时,就必须要进行特别处理了。情况I、看如下PHP代码:viewsourceprint?1全过程如下所示:这段代码的前三句将把a、b和c指向一个zval,其is_ref=1,refcount=3;第四句是个非引用赋值,通常情况下只需要增加引用计数即可,然而目标zval属于引用变量,单纯的增加引用计数显然是错误的,Zend的解决办法是为d单独生成一份zval副本。全过程如下所示:1.1

8、.1参数传递PHP函数参数的传递和变量赋值是一样的,非引用传递相当于非引用赋值,引用传递相当于引用赋值,并且也有可能会导致执行zval状态切换。这在后

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。