深入php使用技巧之变量

深入php使用技巧之变量

ID:1251419

大小:125.00 KB

页数:5页

时间:2017-11-09

深入php使用技巧之变量_第1页
深入php使用技巧之变量_第2页
深入php使用技巧之变量_第3页
深入php使用技巧之变量_第4页
深入php使用技巧之变量_第5页
资源描述:

《深入php使用技巧之变量》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、众所周知,PHP与其他脚本语言一样,属于弱变量类型的语言。同时PHP本身也是通过C语言来实现。本文主要介绍PHP内部是如何实现弱变量类型的,并且据此分析在PHP开发中需要注意的一些使用技术。其中会重点分析PHP中的copyonwrite机制和引用相关方面的话题。本章节属于《深入PHP使用技巧》的第一部分。  如何实现弱变量  在了解PHP实现弱变量类型之前,可以先思考下:如何通过C/C++来实现弱变量类型的效果呢?  这个问题我在BIT培训课上基本上有两种答案:  方法1:采用C++的继承机制。首先定义一个基础类型  ClassVar  {  }  

2、然后基于Var,派生出不同的子类型IntVar/FloatVar/StringVar等等。  方法2:基于C语言的Struct。其中一个字段用于标识类型,另外一个字段用于存储数据,由于数据要是各种类型,所以通常需要采用指针  比如:  structvar{  Inttype;  Void*data;  };  两种思路本身并没有太大区别,也都基本上能够满足需求。在PHP中采用了第二种思路,并且做了比较多的优化。在PHP中,所有的变量都会对应同一种类型zval,其中zval也就是struct_zval_struct,具体定义如下:  typedefun

3、ion_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

4、_uchartype;/*activetype*/  zend_ucharis_ref;  };  从zval可以看出,PHP在细节方面的确做了不少优化的功夫。  1.zend_uchartype。采用uchar节省内存。  2.zvalue_valuevalue;采用union来替换void*,这样同样能节省空间,并且比void*更能表义清晰。  3.在字符串类型中,默认保留了字符串的长度。这样很容易做到字符串的二进制安全,并且在计算字符串长度的时候不需要进行扫描。  观察PHP弱变量的实现,也会有以下疑惑:  1.为什么会没有int类型呢?其实在

5、PHP中是有的,只是说默认int数据就保存在long中。  2.资源类型咋表现的呢?资源在PHP内部其实就是一数字。详细后续会介绍。  3.refcount和is_ref是干嘛的呢?呵呵,这就是第二部分要介绍的了。  Referencecounting&Copy-on-Write  PHP和其他语言类似,在其语法中有两种赋值方式:引用赋值和非引用赋值(普通的==赋值)。    引用赋值和非引用赋值在PHP内部是如何实现的呢?一种通常的认识是:“引用赋值就是两个

6、变量对应同一个Zval,非引用赋值则是直接产生一个新的zval,同时把对应的值直接copy过来。”也就是该代码的内存结构如下:    (该图是大多数人认为的PHP内存结构,是错误的)  这样的确能够满足大部分情况下的需求,但显然不是最佳的解决方案,尤其是在内存管理上,比如说以下代码就会显得非常的低效。    因为每次函数调用会进行一次内存dump,而大内存的内存dum

7、p是非常耗CPU的。在C语言中,一种解决方案是采用指针,所有函数调用尽量传递指针。的确很灵活高效,但也很难维护~指针可以说是C语言程序员心头的痛(当然也是福~^_^)。还有一种更高级更有效的方法是采用引用计数(Referencecounting)。  在PHP中,也可以采用引用来解决这样的问题,但你见过采用在PHP中大量使用引用的吗?显然很少。  在PHP内核中,Zval的实现正是采用了引用计数的概念,说起引用计数就不得不谈到copy-on-write机制。这样前面谈到的refcount和is_ref就有作用了。  refcount:引用次数。在zv

8、al初始创建的时候就为1。每增加一个引用,则refcount++。  is_ref:用于表示一个zval是否

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

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

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