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

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)访问

时间: 2024-11-05 22:52:03

php扩展与嵌入(2)--变量的里里外外的相关文章

《扩展和嵌入python解释器》1.4 模块方法表和初始化函数

<扩展和嵌入python解释器>1.4 模块方法表和初始化函数 1.4 模块方法表和初始化函数 下面,我演示如何从Python程序调用spam_system().首先,我们需要在’方法表’列出名称和地址: [cpp] view plaincopy static PyMethodDef SpamMethods[] = { ... {"system",  spam_system, METH_VARARGS, "Execute a shell command."

JSP页面中嵌入java变量,在标签中调用

在顶部定义java变量: <% String url = request.getContextPath()+"/Page"; %> 在body里的标签中调用该变量 <cusTag:CustomTag allCount="135" currentPageIndex="3" id="pageTag" actionPath="<%=url%>" pageNumber="20

php扩展与嵌入(1)

1>.sapi(迷你版webserver).minit(模块初始化).rinit(扩展请求初始化方法).rshutdown(请求终止).mshutdown(模块终止) 一.生命周期:初始化myextension模块:在sapi启动后调用每个扩展的minit(模块初始化):然后php接着遍历所以的扩展,调用每个扩展的rinit(扩展请求初始化方法):请求处理完后,调用每个php扩展的rshutdown(请求终止)开始清理过程:最后当所以请求都满足,webserver或sapi开始准备终止,调用每个

C++笔记十三:C++对C的扩展——C++中所有变量和函数都必须有类型

C++中所有的变量和函数都必须有类型: C语言中的默认类型在C++中是不合法的! 在C语言里面可以写一些很奇怪的函数!并且可以运行成功! f(i)函数的返回值是什么类型?参数又是什么类型?我们赋值10居然可以打印出来! g()函数可以接受多少个参数?我们没有参数,但是函数调用时我们可以加上参数,并且运行成功! f(i) { printf("i=%d\n",i); } g() { return 5; } int main() { f(10); printf("g()=%d\n&

递归扩展变量和简单扩展变量

1 递归扩展变量和简单扩展变量的区别 最大的区别在于,递归扩展变量等号右边的表达式里面的变量要等到该递归变量被用的时候再去扩展,而简单变量的话,在读取makefile的时候就已经扩展了. 并且简单扩展变量有前后关系,简单扩展变量只能用到在其前面定义的变量,而不能用到在其后面定义的变量.而递归扩展变量,要用的时候,需要扩展的时候,可以一直扩展到不能扩展为止,即递归扩展. 2 例子 foo := $(bar) bar = aaa all:;echo $(foo) 输出为空,因为在给foo赋值扩展等号

(转)shell变量及扩展

1.shell变量 shell变量赋值语句为"name=[value]",等号两边不能有空格,可以给shell变量追加内容"name+=value",取消shell变量的设置使用"unset name",例子如下. $ var=1 $ echo $var 1 $ var=123 $ echo $var 123 $ var+=100 $ echo $var 123100 $ var=a $ echo $var a $ var=abc $ echo

Shell编程-03-Shell中的特殊变量和扩展变量

特殊变量 ? ? 在Shell中的特殊变量主要分别两种位置参数变量.状态变量两种. 位置参数变量 ? ? Shell中的位置参数变量主要是指$0.$1.$#等,主要用于从命令行.函数或脚本执行等地方传递参数.详细说明如下所示: $0:获取当前执行的Shell脚本的文件名,如脚本中包含路径,则输出也包括路径 $n:获取当前执行的Shell脚本的第n个参数值,如n>9,则需要使用用大括号,如${10},各参数间用空格进行分隔 $#:获取当前执行的Shell脚本传入参数的总个数 $*:获取当前执行的S

22 扩展Python - 《Python 核心编程》

?? 引言/动机 ?? 扩展 Python ?? 创建应用程序代码 ?? 用样板包装你的代码 ?? 编译 ?? 导入并测试 ?? 引用计数 ?? 线程和 GIL ?? 相关话题 22.1 介绍/动机 什么是扩展 一般来说,所有能被整合或导入到其它python 脚本的代码,都可以被称为扩展.您可以用纯 Python 来写扩展,也可以用C 和C++之类的编译型的语言来写扩展(或者也可以用Java 给Jython 写 扩展,也可以用C#或Visual Basic.NET 给IronPython 写扩展

linux下环境变量详解

玩Linux也很久了,竟然对环境变量的了解不是很系统,今天就学习下. 参考: www.xuexuhui.blog.51cto.com ================================ Linux是一个多用户的操作系统.每个用户登录系统后,都会有一个专用的运行环境.通常 每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义.用户可以 对自己的运行环境进行定制,其方法就是修改相应的系统环境变量. 常见的环境变量 对于PATH和HOME等环境变量大家都不陌生.除此之外