码迷,mamicode.com
首页 > Web开发 > 详细

php扩展与嵌入(2)--变量的里里外外

时间:2016-03-31 10:44:55      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

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扩展与嵌入(2)--变量的里里外外

标签:

原文地址:http://www.cnblogs.com/zengguowang/p/5340184.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!