浅析PHP原理之变量(Variables inside PHP)
发布时间:2020-12-13 06:32:10 所属栏目:PHP教程 来源:网络整理
导读:或许你知道,或许你不知道,PHP是一个弱类型,动态的脚本语言。所谓弱类型,就是说PHP并不严格验证变量类型(严格来讲,PHP是一个中强类型语言,这部分内容会在以后的文章中叙述),在申明一个变量的时候,并不需要显示指明它保存的数据的类型: 代码如下: $var
或许你知道,或许你不知道,PHP是一个弱类型,动态的脚本语言。所谓弱类型,就是说PHP并不严格验证变量类型(严格来讲,PHP是一个中强类型语言,这部分内容会在以后的文章中叙述),在申明一个变量的时候,并不需要显示指明它保存的数据的类型: 代码如下: $var = 1; //int $var = "laruence"; //string $var = 1.0002; //float $var = array(); // array $var = new Exception('error'); //object; 动态语言,就是说,PHP的语言结构在运行期是可以改变的,比如我们在运行期require一个函数定义文件,从而导致语言的函数表动态的改变。 所谓脚本语言,就是说,PHP并不是独立运行的,要运行PHP我们需要PHP解析器: 代码如下: /usr/bin/php -f example.ph 我前面的文章中已经讲过,PHP的执行是通过Zend engine(ZE,Zend引擎),ZE是用C编写的,大家都知道C是一个强类型语言,也就是说,在C中所有的变量在它被声明到最终销毁,都只能保存一种类型的数据。 那么PHP是如何在ZE的基础上实现弱类型的呢? 在PHP中,所有的变量都是用一个结构-zval来保存的, 在Zend/zend.h中我们可以看到zval的定义: 代码如下: typedef struct _zval_struct { zvalue_value value; zend_uint refcount; zend_uchar type; zend_uchar is_ref; } zval; 其中zvalue_value是真正保存数据的关键部分,现在到了揭晓谜底的时候了,PHP是如何在ZE的基础上实现弱类型的呢? 因为zvalue_value是个联合体(union), 代码如下: typedef union _zvalue_value { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; } zvalue_value; 那么这个结构是如何储存PHP中的多种类型的呢? PHP中常见的变量类型有: PHP根据zval中的type字段来储存一个变量的真正类型,然后根据type来选择如何获取zvalue_value的值,比如对于整型和bool值: 代码如下: zval.type = IS_LONG;//整形 zval.type = IS_BOOL;//布尔 就去取zval.value.lval,对于bool值来说lval∈(0|1); 如果是双精度,或者float则会去取zval.value的dval。 而如果是字符串,那么: 代码如下: zval.type = IS_STRIN 这个时候,就会取: zval.value.str 而这个也是个结构,存有C分格的字符串和字符串的长度。 而对于数组和对象,则type分别对应IS_ARRAY,IS_OBJECT,相对应的则分别取zval.value.ht和obj 比较特别的是资源,在PHP中,资源是个很特别的变量,任何不属于PHP内建的变量类型的变量,都会被看作成资源来进行保存,比如,数据库句柄,打开的文件句柄等等。 对于资源: 代码如下: type = IS_RESOURC 这个时候,会去取zval.value.lval, 此时的lval是个整型的指示器, 然后PHP会再根据这个指示器在PHP内建的一个资源列表中查询相对应的资源(这部分的内容,我以后会单独开一个篇文章来介绍),目前,你只要知道此时的lval就好像是对应于资源链表的偏移值。 代码如下: ZEND_FETCH_RESOURCE(con,type,zval *,default,resource_name,resource_type); 借用这样的机制,PHP就实现了弱类型,因为对于ZE的来说,它所面对的永远都是同一种类型,那就是zval。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |