php中变量有三个基本的特性:

1、变量符号。也就是变量的名称。形象比喻,kv中的key。这个有php引擎的符号表(hash表)管理。

2、变量类型。一个php变量可以是boolean、integer、float、string、array、object、resource或者为NULL。

3、变量内容。比如:1、"sdfsdf"、array(1,2,3)。由内存分配。

php引擎中的变量描述:

typedef union _zvalue_value{

long lval;

double dval;

struct {

char *val;

int len;

} str;

HashTable *ht;

zend_object_value obj;

} zvalue_value;

typedef struct _zval_struct zval;

struct _zval_struct {

zvalue_value value;

zend_uint refcount;

zend_uchar type;

zend_uchar is_ref;

};

解释说明:

1、从上面的结构可以看出zend用zval结构描述了上述的2、3特性。union类型的_zvalue_value实现了php的弱类型,也就是不用声明php变量的类型,它可以是任意一个合法的php类型。

2、_zvalue_value中,lval用于存储boolean、integer、resource,dval用于存储float,str用于存储string,ht用于存储array,obj用于存储object,NULL类型不存储,zval.type=IS_NULL。此处可以看出php的资源类型resource实质是是一个整形,它是一个指向资源的c指针。

3、_zval_struct 结构中。is_ref表示该zval是不是一个引用(php中的引用,不用于c中的指针)。refcount为指向这个zval的符号表中的变量名的个数(用于垃圾回收),也就是说有几个变量用到这个zval。type为php变量的类型。

举例:

<?php

$a=123;

$b=$a;

?>

$a=123;

声明一个变量名$a,由符号表管理。同时创建一个zval。zval.is_ref=0,zval.refcount=1,zval.lval=123,zval.type=ZVAL_LONG。

$b=$a;

此处声明一个变量$b,由符号表管理。这个语句在执行的时候并没用创建zval,而是和符号$a指向了同一个zval。zval.refcount=2。如果后边再来一个$b=56;此时会创建另外一个zval,后边会实验解释……

php变量那些事:php引擎对变量声明、存储简要分析(ZVAL)的更多相关文章

  1. ThinkPHP模版引擎之变量输出具体解释

    ThinkPHP模版引擎之变量输出具体解释 使用ThinkPHP开发有一定时间了,今日对ThinkPHP的模板引擎变量解析深入了解了一下.做出一些总结,分享给大家供大家參考. 详细分析例如以下: 我们 ...

  2. GoFrame 模板引擎对变量转义输出- XSS 漏洞

    GoFrame 模板引擎对变量转义输出- XSS 漏洞 环境: gf v1.14.4 go 1.11 官网说明 默认情况下,模板引擎对所有的变量输出并没有使用HTML转码处理,也就是说,如果开发者处理 ...

  3. JavaScript变量那些事

    引言 JavaScript的变量本质是松散类型的,也就是说其变量就是用于保存特定值的一个名字,变量的值和数据类型可以在脚本执行的生命周期中发生变化.这是一个很有趣很强大的特性,但是也是一个极容易出错误 ...

  4. (52)Wangdao.com第七天_字面量/变量_标识符_数据类型_数据的存储

    JavaScript 字面量 和 变量 字面量:就是那些不可变的值,如1,2,100,2000,Infinity,NaN 变量: 变量,代表的当前随机分配的内存地址. 变量的值,是可变的,可以用来保存 ...

  5. php extract 函数的妙用 数组键名为声明为变量,键值赋值为变量内容

    extract 函数的妙用 数组键名为声明为变量,键值赋值为变量内容 它的主要作用是将数组展开,键名作为变量名,元素值为变量值,可以说为数组的操作提供了另外一个方便的工具

  6. Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1

    Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1.1.1       C++内建变量(__LINE__).... 1.1.2       ...

  7. (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)

    本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...

  8. awk内置变量 awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

    ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 ...

  9. Linux添加目录到环境变量以及添加sublime到环境变量

    博主之前有过这种情况,就是在普通用户下su ls等命令还有效,可登陆进root用户之后这些常用的命令竟然失效了. 像这样 这问题其实很简单,但是对于不清楚环境变量的配置的同学来说也的确棘手,我之前就是 ...

随机推荐

  1. nyoj 93 汉诺塔(三)

    点击打开链接 汉诺塔(三) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝 ...

  2. wap资费页面

    移动网关 CMWAP 返回vnd.wap.wml 用CMWAP接入点发一个http的请求时,移动的10.0.0.172这个代理网关会回一个确认页面,中国特色.处理的办法是检测到Content-type ...

  3. docker错误

     错误:cannot enable tty mode on non tty input 错误产生: root@machine1:/data# echo test|docker exec -i 68 ...

  4. Chapter Querying Data

    Chapter Querying Data XF获取数据的三种方法: 其中参数schema,参见 Chapter Schema. 下面列出一个后面将会用到的schema片段,称之为片段A: <U ...

  5. 在 WPF 程序中使用 MVVM 模式

    MVVM 模式是一个很久之前的技术了,最近因为一个项目的原因,需要使用 WPF 技术,所以,重新翻出来从前的一段程序,重温一下当年的技术. MVVM 模式 MVVM 实际上涉及三个部分,Model, ...

  6. VS2010 和VS2012 的程序在XP上运行的方法

    问题表象: VS2012编译的程序不能再XP下运行 解决办法: 1.工程设置的方法 在vs2012里,右键 属性->配置属性-常规->平台工具集->选个VS2008什么的就ok了~ ...

  7. 【Unity Shaders】学习笔记——SurfaceShader(八)生成立方图

    [Unity Shaders]学习笔记——SurfaceShader(八)生成立方图 转载请注明出处:http://www.cnblogs.com/-867259206/p/5630261.html ...

  8. 对.Net系统架构改造的一点经验和教训

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 在互联网行业,基于Unix/Linux的网站系统架构毫无疑问是当今主流的架构解决方案 ...

  9. 学习记录 java 链表知识

    01.import java.util.HashMap; 02.import java.util.Scanner; 03.import java.util.Stack; 04. 05./** 06. ...

  10. java学习之(接口)

    使用接口 接口不能用于创建实例,但接口可以用于声明引用类型变量.当使用接口来声明引用类型变量时,这个引用类型变量必须引用到其实现类的对象.除此之外,接口的主要用途就是被实现类实现.归纳起来,接口主要有 ...