php变量的研究

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字符串二进制
实证研究中的控制变量、调节变量的实证研究、研究变量的四种类型、对函数多元变量的研究、在研究中的自变量是指,以便于您获取更多的相关知识。

时间: 2024-10-22 18:01:48

php变量的研究的相关文章

php扩展和嵌入式编程基础

php的生命周期详解 php变量的研究 php内存管理详解 安装构建php环境 编写第一个php扩展 php函数的返回值 php扩展函数接受参数 php如何在数组和哈希表上工作 PHP的资源数据类型 php4的对象详解 详解php5对象 详解php的启动过程 php的INI设置 php中流的访问 php中流的实现 php中有趣的流 php源代码的配置和链接 php的扩展自动生成 设置嵌入php的宿主环境 php的高级嵌入式

FFMPeg代码分析:AVFrame结构体及其相关的函数

AVFrame结构体保存的是解码后和原始的音视频信息.AVFrame通过函数av_frame_alloc()初始化,该函数仅仅分配AVFrame实例本身,而没有分配其内部的缓存.AVFrame实例由av_frame_free()释放:AVFrame实例通常分配一次,重复使用,如分配一个AVFrame实例来保留解码器中输出的视频帧(此时应在恰当的时候使用av_frame_unref()清理参考帧并将AVFrame归零).该类所描述的数据通常由AVBuffer的API来保存一个引用计数,并保存于AV

华山医院信息中心主任:把AI与临床结合后才发现,过去做的事仅是冰山一角

"我觉得AI这东西,对医学太有诱惑力了." "当人工智能与临床相结合后才能感受到它的力量,才会发现我们能借助它做的事情太多太多.有时候甚至觉得过去十几.二十年来干的信息化,跟AI所发挥的作用一比只是冰山一角.当你翘开一小部分AI后,一定会发现它背后所能承载的价值和体量非常之巨大." 在谈到AI对医院和医学的作用时,上海华山医院信息中心主任黄虹激动地说到. 黄虹所在的复旦大学附属华山医院,是国家卫生计生委委属医院.复旦大学附属教学医院和中国红十字会冠名的医院,1992

Linux环境变量加载的研究

我们经常遇到在linux执行某条命令时出现xxx文件没找到的问题.很多情况都不是库没有安装,而是环境变量的错误. 但是,我明明是设置了环境变量啊.所以,我对此进行了试验. 我们登录linux有很多种,bash来交互式执行,或者直接非交互式执行命令.在我的试验后,发现,原来这几个的环境变量加载都是不同的. 相关文件: 从电脑上,我找到这么几个相关文件. 1 /etc/profile 2 /etc/environment 3 /etc/bashrc 4 ~/.bash_profile 5 ~/.ba

51 彩屏问题-51开发板 彩屏如何显示实时温度 是否需要变量函数 初来乍到 刚开始研究

问题描述 51开发板 彩屏如何显示实时温度 是否需要变量函数 初来乍到 刚开始研究 解决方案 当然需要变量,你首先需要从外部采集当当前温度,将温度放在这个变量里,然后显示即可.不过看你这个彩屏显示函数的参数,你需要把这个整型温度变量转换为字符串型.

php中include文件变量作用域的研究

原文:php中include文件变量作用域的研究   在php中我们有时候需要include一个文件.比如我前段时间在写一个框架的时候,打算用原生的php作为模板,然后写一个display方法引入模板文件就可以,但是这只是我的意淫而已. 写完后发现在模板中所有的变量都提示未定义.通过各种研究和查找资料,总结了include文件时的几种情况下的作用域.   第一种情况:A文件include B文件,在B文件中可以调用A中的变量. A文件代码: <?php $aaa = '123'; include

深入研究JScript语法——常量和变量

js|jscript|变量|语法 例子: 前面的例子中: return "<font color=gray>"+hit+"</font>" 使用了变量和常量,"<font color=gray>"和"</font>"是文本常量,hit是变量. 加号(+)则将三者加成一个文本:"<font color=gray>100</font>",如

关于web应用程序的范围与session变量丢失问题的深入研究

session|web|变量|程序|问题 引言:最近不少网友都有这样的疑问,就是当我们在一个网页间设定了一个session变量后,到另一个网页,却消失了.这是什么样的原因呢.如果你详细的读完本文,相信能给你一个完整的答复! 一:前言--关于web应用程序    我们今天所讨论的web 应用程序是指由Windows NT Option Pack 提供的一个建立 Internet 或Intranet的 Web应用程序的平台.而Web 应用程序可以作为一组 Web 页交付使用,它们向封装了事务逻辑并提

关于Global.asa文件的深入研究与session变量失效提示的具体方法

一:Global.asa文件的释疑!从字面上讲!Global就是全局的,全球的意思!    我们都知道!浏览器中的变量存活期十分短暂!只有几十秒!也就是一个页面的下载时间.那么我们怎样从生命开始到结束都追踪session级变量哪?靠asp文件已经力不从心了!微软告诉我们:靠我们的Global.asa吧!    global.asa是一个可选的文件!他必须放在你的www根目录下,或是虚拟目录的根目录下.这样,可以确保你的一个应用程序共享一个global.asa文件.正是他可以在你的应用程序开始始终