php变量的研究
每种编程语言共有的一个特性是存储和取回信息; php也不例外. 虽然许多语言要求所有的变量都要在使用之前被定义, 并且它们的类型信息是固定的, 然而php允许程序员在使用的时候创建变量, 并且可以存储任意类型语言能够表达的信息. 并且还可以在需要的时候自动的转换变量类型.
因为你已经使用过用户空间的php, 因此你应该知道这个概念是"弱类型". 本章, 你将看到这些信息在php的父语言----c(C的类型是严格的)中是怎样编码的.
当然, 数据的编码只是一半工作. 为了保持对所有这些信息片的跟踪, 每个变量还需要一个标签和一个容器. 从用户空间角度来看, 你可以把它们看做是变量名和作用域的概念.
数据类型
php中的数据存储单位是zval, 也称作Zend Value. 它是一个只有4个成员的结构体, 在Zend/zend.h中定义, 格式如下:
typedef struct _zval_struct { zval_value value; zend_uint refcount; zend_uchar type; zend_uchar is_ref; } zval;
我们可以凭直觉猜想到这些成员中多数的基础存储类型: unsigned integer的refcount, unsigned character的type和is_ref. 而value成员实际上是一个定义为union的结构, 在php5中, 它定义如下:
typedef union _zvalue_value { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; } zvalue_value;
union允许Zend使用一个单一的, 统一的结构来将许多不同类型的数据存储到一个php变量中.
zend当前定义了下表列出的8种数据类型:
类型值
目的
IS_NULL
这个类型自动的赋值给未初始化的变量,直到它第一次被使用.也可以在用户空间使用内建的NULL常量进行显式的赋值.这个变量类型提供了一种特殊的"没有数据"的类型,它和布尔的FALSE以及整型的0有所不同.
IS_BOOL
布尔变量可以有两种可能状态中的一种, TRUE/FALSE.用户空间控制结构if/while/ternary/for等中间的条件表达式在评估时都会隐式的转换为布尔类型.
IS_DOUBLE
浮点数据类型,使用主机系统的signed double数据类型.浮点数并不是以精确的精度存储的;而是用一个公式表示值的小数部分的有限精度(译注:浮点数被表示为3部分:符号,尾数--小数部分,指数.浮点数的值 =符号 *尾数 * 2 ^指数----来自BSD Library Functions Manual: float(3)).这种计数法允许计算机存储很大范围的值(正数或负数):用8字节就可以表示2.225*10^(-308)到1.798*10^(308)范围内的数字.不幸的是它评估的数字实际的十进制并不能总是像二进制分数一样干净的存储.例如,十进制表达式0.5转换为二进制的精确值是0.1,然而十进制的0.8转换为二进制则是无限循环的0.1100110011...,当它转换回十进制时,因为无法存储被丢弃的二进制位将无法恢复.类似的可以想一下将1/3转换为十进制的0.333333,两个值非常相近,但是它不精确,因为3 * 0.333333并不等于1.0.这个不精确常常会在计算机上处理浮点数时让人迷惑.(这些范围限制通常是基于32位平台的;不同的系统范围可能不同)
IS_STRING
php中最常见的数据类型是字符串,它的存储方式符合有经验的C程序员的预期.分配一块足够大去保存字符串中所有的字节/字符的内存,并将指向该字符串的指针保存在宿主zval中.
值得注意的是php字符串的长度总是显式的在zval结构中指出.这就允许字符串包含NULL字节而不被截断.关于php字符串的这一方面,我们往后称为"二进制安全"因为这样做使得它可以安全的包含任意类型的二进制数据.
需要注意的是为一个php字符串分配的内存总量总是最小化的:长度加1.最后的一个字节存放终止的NULL字符,因此不关心二进制安全的函数可以直接传递字符串指针.
IS_ARRAY
数组是一种特殊目的的变量,它唯一的功能就是组织其他变量.不像C中的数组概念, php的数组并不是单一类型数据的向量(比如zval arrayofzvals[];).实际上, php的数组是一个复杂的数据桶集合,它的内部是一个HashTable.每个HashTable元素(桶)包含两个相应的信息片:标签和数据.在php数组的应用场景中,标签就是关联数组的key或数值下表,数据就是key指向的变量(zval)
IS_OBJECT
对象拥有数组的多元素数据存储,此外还增加了方法,访问修饰符,作用域常量,特殊的事件处理器.作为一个扩展开发者,构建在php4和php5中等价的面向对象代码是一个很大的挑战,因为在Zend引擎1(php4)和Zend引擎2(php5)之间,内部的对象模型有非常大的变更.
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索字符串
, 二进制
, 变量
, 数据类型
, 类型
, 一个
php字符串二进制
实证研究中的控制变量、调节变量的实证研究、研究变量的四种类型、对函数多元变量的研究、在研究中的自变量是指,以便于您获取更多的相关知识。