php变量那些事:php引擎对变量声明、存储简要分析(ZVAL)
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)的更多相关文章
- ThinkPHP模版引擎之变量输出具体解释
ThinkPHP模版引擎之变量输出具体解释 使用ThinkPHP开发有一定时间了,今日对ThinkPHP的模板引擎变量解析深入了解了一下.做出一些总结,分享给大家供大家參考. 详细分析例如以下: 我们 ...
- GoFrame 模板引擎对变量转义输出- XSS 漏洞
GoFrame 模板引擎对变量转义输出- XSS 漏洞 环境: gf v1.14.4 go 1.11 官网说明 默认情况下,模板引擎对所有的变量输出并没有使用HTML转码处理,也就是说,如果开发者处理 ...
- JavaScript变量那些事
引言 JavaScript的变量本质是松散类型的,也就是说其变量就是用于保存特定值的一个名字,变量的值和数据类型可以在脚本执行的生命周期中发生变化.这是一个很有趣很强大的特性,但是也是一个极容易出错误 ...
- (52)Wangdao.com第七天_字面量/变量_标识符_数据类型_数据的存储
JavaScript 字面量 和 变量 字面量:就是那些不可变的值,如1,2,100,2000,Infinity,NaN 变量: 变量,代表的当前随机分配的内存地址. 变量的值,是可变的,可以用来保存 ...
- php extract 函数的妙用 数组键名为声明为变量,键值赋值为变量内容
extract 函数的妙用 数组键名为声明为变量,键值赋值为变量内容 它的主要作用是将数组展开,键名作为变量名,元素值为变量值,可以说为数组的操作提供了另外一个方便的工具
- Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1
Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1.1.1 C++内建变量(__LINE__).... 1.1.2 ...
- (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)
本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...
- awk内置变量 awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 ...
- Linux添加目录到环境变量以及添加sublime到环境变量
博主之前有过这种情况,就是在普通用户下su ls等命令还有效,可登陆进root用户之后这些常用的命令竟然失效了. 像这样 这问题其实很简单,但是对于不清楚环境变量的配置的同学来说也的确棘手,我之前就是 ...
随机推荐
- [HDU 3535] AreYouBusy (动态规划 混合背包 值得做很多遍)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n个任务集合,需要在T个时间单位内完成.每个任务集合有属性,属性为0的代表至少要完成1个 ...
- C# 自定义事件(EventArgs)
1,自定义事件: public class TextChangeEventArgs : EventArgs { private string message; public TextC ...
- python 赋值,交换值理解
python里的赋值都是引用,第一次赋值就是定义. 看下面两个交换值的例子: 1. >>> a,b,c = 1,2,3 >>> a = b >>> ...
- this.Invoke
this.Invoke(new Action(() => { }));
- MFC学习 序列化
void CArchiveView::OnWrite() { // Archive就是可序列化的类, 要头文件中DECLARE_DYNCREATE(CArchiveDoc) // 重写 virtual ...
- Android ImageView 详述
结构 继承关系 public classView.OnClickListner extendsView java.lang.Object android.view.View android.widge ...
- MCADEx Tools 6.3下载地址
MCADEx Tools 6.3下载地址: http://pan.baidu.com/s/1pLxQPkR 修改参数批量设置工具为模型批量检查工具; 修改模型批量检查过滤工具; 修改工程图管理过滤工具 ...
- C语言程序设计50例(二)(经典收藏)
[程序11]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?1.程序分析: 兔子的规律为数列1,1 ...
- C程序之修改Windows的控制台颜色(转载)
Windows的CMD可以和Linux下的终端一样可以有五颜六色,目前我在网上找到2种方法可以修改Windows的CMD,当然都是在代码中修改的.在“CMD”->“属性”->“颜色”,这种 ...
- 【转载】Myeclipse如何自动创建hibernate
Myeclipse如何自动创建hibernate:http://jingyan.baidu.com/article/456c463b99f4370a583144a8.html An internal ...