欢迎来到天天文库
浏览记录
ID:37922907
大小:130.00 KB
页数:6页
时间:2019-06-02
《PHP使用技巧之变量》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、内涵笑话:http://www.youdianlei.com一品江山最新章节:http://www.yipinjiangshan.netPHP使用技巧之变量众所周知,PHP与其他脚本语言一样,属于弱变量类型的语言。同时PHP本身也是通过C语言来实现。本文主要介绍PHP内部是如何实现弱变量类型的,并且据此分析在PHP开发中需要注意的一些使用技术。其中会重点分析PHP中的copyonwrite机制和引用相关方面的话题。本章节属于《深入PHP使用技巧》的第一部分。如何实现弱变量在了解PHP实现弱变量类型之前,可以先思考下:如何通过C
2、/C++来实现弱变量类型的效果呢?这个问题我在BIT培训课上基本上有两种答案:方法1:采用C++的继承机制。首先定义一个基础类型1ClassVar2{3}然后基于Var,派生出不同的子类型IntVar/FloatVar/StringVar等等。方法2:基于C语言的Struct。其中一个字段用于标识类型,另外一个字段用于存储数据,由于数据要是各种类型,所以通常需要采用指针比如:4structvar{5Inttype;6Void*data;7};两种思路本身并没有太大区别,也都基本上能够满足需求。在PHP中采用了第二种思路,并且做
3、了比较多的优化。在PHP中,所有的变量都会对应同一种类型zval,其中zval也就是struct_zval_struct,具体定义如下:8typedefunion_zvalue_value{9longlval;/*longvalue*/10doubledval;/*doublevalue*/11struct{12char*val;13intlen;14}str;15HashTable*ht;/*hashtablevalue*/承天八索:http://www.chengtianbasuo.com藏海花第二部:http://www
4、.chengtianbasuo.com内涵笑话:http://www.youdianlei.com一品江山最新章节:http://www.yipinjiangshan.net1zend_object_valueobj;2}zvalue_value;3struct_zval_struct{4/*Variableinformation*/5zvalue_valuevalue;/*value*/6zend_uintrefcount;7zend_uchartype;/*activetype*/8zend_ucharis_ref;9};
5、从zval可以看出,PHP在细节方面的确做了不少优化的功夫。1.zend_uchartype。采用uchar节省内存。2.zvalue_valuevalue;采用union来替换void*,这样同样能节省空间,并且比void*更能表义清晰。3.在字符串类型中,默认保留了字符串的长度。这样很容易做到字符串的二进制安全,并且在计算字符串长度的时候不需要进行扫描。观察PHP弱变量的实现,也会有以下疑惑:1.为什么会没有int类型呢?其实在PHP中是有的,只是说默认int数据就保存在long中。2.资源类型咋表现的呢?资源在PHP内部
6、其实就是一数字。详细后续会介绍。3.refcount和is_ref是干嘛的呢?呵呵,这就是第二部分要介绍的了。Referencecounting&Copy-on-WritePHP和其他语言类似,在其语法中有两种赋值方式:引用赋值和非引用赋值(普通的==赋值)。10引用赋值和非引用赋值在PHP内部是如何实现的呢?一种通常的认识是:“引用赋值就是两个变量对应同一个Zval,非引用赋值则是直接产生一个新的zval,同时把对应的值直接copy过
7、来。”也就是该代码的内存结构如下:承天八索:http://www.chengtianbasuo.com藏海花第二部:http://www.chengtianbasuo.com内涵笑话:http://www.youdianlei.com一品江山最新章节:http://www.yipinjiangshan.net(该图是大多数人认为的PHP内存结构,是错误的)这样的确能够满足大部分情况下的需求,但显然不是最佳的解决方案,尤其是在内存管理上,比如说以下代码就会显得非常的低效。1
8、非常大的PHP数组3myfunc($arr);//每一个函数调用都是一次隐性的非引用赋值4myfunc($arr);5?>因为每次函数调用会进行一次内存dump,而大内存的内存dump是非常耗CPU的。在C语言中,一种解决方案是采用指针,www.chengtianbasuo.
此文档下载收益归作者所有