php扩展与嵌入--变量的里里外外
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php扩展与嵌入--变量的里里外外相关的知识,希望对你有一定的参考价值。
1>.php中的数据存储单元是【zval】--> 【Zend Value】:
zval_value value【union的结构,它允许Zend使用单一的,统一的结构来将许多不同类型的数据存储到一个php变量中】;
zend_uint refcount【unsigned的integer(整数)】;
zend_uchar type【unsigned character(字符)】;
zend_uchar is_ref【unsigned character(字符)】;
下列八种Zend定义的数据类型(is_*常量被存储在Zval结结构的type元素中,用来确定在测试变量的值时应该 查看value元素中的哪个部分):
is_null:这个类型自动的赋值给未初始化的变量, 直到它第一次被使用. 也可以在用户空间使用内建的NULL常量进行显式的赋值. 这个变量类型提供了一种特殊的"没有数据"的类型, 它和布尔的FALSE以及 整型的0有 所不同
is_bool:布尔变量可以有两种可能状态中的一种, TRUE/FALSE. 用户空间控制结构if/while/ternary/for等中间的条件表达式在评估时都会隐式的转换为布尔类型
is_double:浮点数据类型, 使用主机系统的signed double数据类型. 浮点数并 不是以精确的精度存储的; 而是用?个公式表示值的小数部分的 有限精度
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:对象拥有数组的多元素数据存储, 此外还增加了方法, 访问修饰符, 作用域常量, 特殊的事件处理器
is_resource:有?些数据类型并不能简单的映射到用户空间
这个宏的_P后缀标识传递的参数应该是?级间访的指针. 还有另外两个宏Z_TYPE() 和Z_TYPE_PP(), 它们期望的参数类型是zval(非指针)和zval **(两级间访指针);
2>.数据值:
和类型一样, zval的值也可以用3个一组的宏检查. 这些宏总是以Z_开始, 可选的以_P 或_PP结尾, 具体依赖于它们的间访层级;对于简单的标量类型, boolean, long, double, 宏简写为: BVAL, LVAL, DVAL
字符串:由于字符串变量包含两个成员, 因此它有?对宏分别表示char *(STRVAL)和int(STRLEN)成员
数组:数组数据类型内部以HashTable *存储, 可以使用: Z_ARRVAL(zv),Z_ARRVAL_P(pzv), Z_ARRVAL_PP(ppzv)访问
以上是关于php扩展与嵌入--变量的里里外外的主要内容,如果未能解决你的问题,请参考以下文章