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用户之后这些常用的命令竟然失效了. 像这样 这问题其实很简单,但是对于不清楚环境变量的配置的同学来说也的确棘手,我之前就是 ...
随机推荐
- LayoutInflater的实例化
获得 LayoutInflater 实例的三种方式 1. LayoutInflater inflater = getLayoutInflater(); //调用Activity的getLayoutI ...
- [Android疑难杂症]动态改变Background后Padding无效的问题
前言 在Layout中指定好background和padding以后,程序里面动态修改background之后padding就失效了,貌似是一个BUG,这里找到了一篇英文文章,简单翻译分享一下. 声明 ...
- Oracle 11gR2 Database UNDO表空间使用率居高不下-转载
客户的数据库是Oracle Database 11.2.0.3.0 for AIX 6.1 64bit的单机数据库.客户查询DBA_FREE_SPACE发现UNDO表空间的使用率高达98%以上.客户的 ...
- FAQ: Automatic Statistics Collection (文档 ID 1233203.1)
In this Document Purpose Questions and Answers What kind of statistics do the Automated tasks ...
- jdk线程的简单使用
一.线程的实现方式方式一:继承Thread类一个类只要继承了Thread类,并重写run()方法,则就可以实现多线程的操作. public class ThreadDemo01 { public st ...
- selenium和Firefox版本不兼容
selenium8.py coding = utf-8 from selenium import webdriver driver = webdriver.Firefox() driver.get(' ...
- Editplus 注册码
EditPlus 是一款功能强大的文字处理软件.它可以充分的替换记事本,它也提供网页作家及程序设计师许多强悍的功能.支持 HTML.CSS.PHP.ASP.Perl.C/C++.Java.JavaSc ...
- [翻译]AlphaGO留给我们的东西
来源:http://headlines.yahoo.co.jp/hl?a=20160317-00000049-cnippou-krhttp://headlines.yahoo.co.jp/hl?a=2 ...
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part3:右值引用
本文为第三部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/4220233.html. 右值引用 如果x是任意类型,那么x&&则被称作一个 ...
- [AFUI]App Framework Quickstart
---------------------------------------------------------------------------------------------------- ...