PHP变量的实现原理【转】
PHP是一门弱语言,也就说PHP的一个变量可以保存任意类型的变量,PHP是用C语言实现的,而C语言是一个强类型的语言,每个变量都有固定的类型,不能随意改变变量的类型(虽然可以通过强制类型转换,可能会出问题)。在zend引擎中的实现:
引用的是PHP 5的源码:
打开zend.h 会发现定义了如下的结构体:
typedef struct _zval_struct zval;
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
zend_ast *ast;
} zvalue_value;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};
其中 zval 就是PHP的变量的底层实现,zval是用结构体来实现的。
在zvalue_value中:
lval 是long类型数据,即是C语言中long。
dval 是double类型数据,即是C语言中double。
str 是一个结构体,成员变量var是char类型的指针,指向一个字符数组的首地址,为了数据安全,用len告诉系统要取多长的数据。
ht 是一个hash表结构,是为了存储数组;
obj 是为了存储对象类型;其中zend_object_value 就是zend为了存储对象而定义的结构体。
ast 是PHP 5.6以后才有的,是为了存储常量;
在_zval_struct中,
value 即是上述所说的zvalue_value,也就是存储的数据;
refcount__gc 即是变量的引用数,变量引用计算器。
type 变量的类型,为了保存当前所存储的数据,是哪一个类型的数据;常用类型如下所示:
#define IS_NULL 0
#define IS_LONG 1
#define IS_DOUBLE 2
#define IS_BOOL 3
#define IS_ARRAY 4
#define IS_OBJECT 5
#define IS_STRING 6
#define IS_RESOURCE 7
is_ref__gc 变量是否被引用。
对变量类型的解析:
IS_NULL |
0 |
空 |
IS_LONG |
1 |
long类型变量 |
IS_DOUBLE |
2 |
double类型变量 |
IS_BOOL |
3 |
布尔变量 |
IS_ARRAY |
4 |
数组 |
IS_OBJECT |
5 |
对象 |
IS_STRING |
6 |
字符串 |
IS_RESOURCE |
7 |
资源类型变量 |
关于资源类型的变量:资源类型是一种特殊的变量,保存了到外部资源的一个引用。比如数据库的连接,打开文件,图形画布区域;
资源类型本质上存储是一个整数,也就是resource ID ,zend可以根据这个ID去找到最终所需要的数据;
例如:$file_source = fopen(“a.txt”,”r”);
可以用is_resource()函数测定一个变量是否是资源,函数get_resource_type()则返回该资源的类型。
关于变量的赋值会有 写时复制机制。
最新文章
- SharePoint Online 创建门户网站系列之首页布局
- 5分钟破解wpa2密码(转)
- mysql中bigint在php中表示
- mongodb exception in initAndListen: 12596 old lock file, terminating 解决方法
- ppt类似工具AxeFile使用心得
- Caused by: java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.MetadataPro
- Makefile基础---编译
- 搭建、访问ftp
- LeetCode(119. 杨辉三角 II)
- Shell - 简明Shell入门15 - 调试(Debug)
- Webpack2 升级指南和特性摘要(转)
- Storm架构和编程模型总结
- is not on any development teams
- Oracle 12c on Solaris 10 安装文档
- Git----远程仓库01
- 获取Linux下的IP地址 java代码
- [Java多线程]-并发,并行,synchonrized同步的用法
- centos7安装rabbitmq并简单使用
- Unknown entity XXX
- Java学习笔记(一)——关于java中的String类