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()则返回该资源的类型。

关于变量的赋值会有 写时复制机制。

最新文章

  1. SharePoint Online 创建门户网站系列之首页布局
  2. 5分钟破解wpa2密码(转)
  3. mysql中bigint在php中表示
  4. mongodb exception in initAndListen: 12596 old lock file, terminating 解决方法
  5. ppt类似工具AxeFile使用心得
  6. Caused by: java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.MetadataPro
  7. Makefile基础---编译
  8. 搭建、访问ftp
  9. LeetCode(119. 杨辉三角 II)
  10. Shell - 简明Shell入门15 - 调试(Debug)
  11. Webpack2 升级指南和特性摘要(转)
  12. Storm架构和编程模型总结
  13. is not on any development teams
  14. Oracle 12c on Solaris 10 安装文档
  15. Git----远程仓库01
  16. 获取Linux下的IP地址 java代码
  17. [Java多线程]-并发,并行,synchonrized同步的用法
  18. centos7安装rabbitmq并简单使用
  19. Unknown entity XXX
  20. Java学习笔记(一)——关于java中的String类

热门文章

  1. 正则表达式之——exec,match
  2. VC中edit控件使用
  3. 一个BUG?Visual Studio 2017 C++编写交换两个整数
  4. linux下进程的最大线程数、进程最大数、进程打开的文件数
  5. 【ISIS(中间系统到中间系统)路由链路状态信息协议初识】
  6. XPath Helper的安装使用
  7. 一个好用的C# HttpHelper类
  8. php-5.6.26源代码 - hash存储结构 - 添加
  9. scrapy框架爬取笔趣阁
  10. 学习RUNOOB.COM进度一