php变量的实现方法:首先声明一个zval指针,并申请一块内存;然后通过【zval_string】宏将值设置为bar;最后就是将这个zval加入到当前的符号表里去,并将其label定义成foo。
【相关学习推荐:php图文教程】
php变量的实现方法:
简介
在官方的php实现内部,所有变量使用同一种数据结构(zval)来保存,而这个结构同时表示php中的各种数据类型。 它不仅仅包含变量的值,也包含变量的类型。这就是php弱类型的核心。
标量类型: boolean、integer、float(double)、string
复合类型: array、object
特殊类型: resource、null
变量的存储结构
php在内核中是通过zval这个结构体来存储变量的,它的定义在zend/zend.h文件里,简短精炼,只有四个成员组成:
struct _zval_struct { zvalue_value value; /* 变量的值 */ zend_uint refcount__gc; zend_uchar type; /* 变量当前的数据类型 */ zend_uchar is_ref__gc;};typedef struct _zval_struct zval;//在zend/zend_types.h里定义的:typedef unsigned int zend_uint;typedef unsigned char zend_uchar;
refcount__gc 表示引用计数 1
is_ref__gc 表示是否为引用 0
value 存储变量的值
type 变量具体的类型
变量的类型
zval结构体的type字段就是实现弱类型最关键的字段,type的值可以为: is_null、is_bool、is_long、is_double、is_string、is_array、is_object、is_resource。 从字面上就很好理解,他们只是类型的唯一标示,根据类型的不同将不同的值存储到value字段。 除此之外,和他们定义在一起的类型还有is_constant和is_constant_array。
示例
<?php$foo = 'bar';?>
上面是一段php语言的例子,创建一个变量,并把它的值设置为'bar',步骤: 创建一个zval结构,并设置其类型。 设置值为'bar'。 将其加入当前作用域的符号表,这样用户才能在php里使用这个变量 具体的代码为:
{ zval *fooval; make_std_zval(fooval); zval_string(fooval, "bar", 1); zend_set_symbol( eg(active_symbol_table) , "foo" , fooval);}
首先,我们声明一个zval指针,并申请一块内存。然后通过zval_string宏将值设置为bar,最后一行的作用就是将这个zval加入到当前的符号表里去,并将其label定义成foo,这样用户就可以在代码里通过$foo来使用它。
相关学习推荐:php编程(视频)
以上就是php变量是如何实现的的详细内容。