源码研究:php变量
一:php中的变量类型
1、标量类型:布尔型 bool,整型 int,浮点型 float,字符串型 string
2、复杂类型:数组 array,对象 object
3、特殊类型:NULL,资源 resource
这些变量都是怎么实现的呢?我们都知道php是用 c 语言实现的,那是怎么用c语言实现的呢?
来看看php5.5.7的源码,看是怎么实现的,最主要的是 zval 这个结构体
二:zval的定义
在 zend/zend_types.h
typedef struct _zval_struct zval
_zval_struct 这个结构体,是在 zend/zend.h 中定义的
struct _zval_struct {
    /* Variable information */
    zvalue_value value; /* value */
    zend_uint refcount__gc;
    zend_uchar type; /* active type */
    zend_uchar is_ref__gc;
};
_zval_struct 结构体里面有个 zvalue_value value 这个就是变量存储的值,
                     zend_uchar type 这个就是变量的类型,判断一个变量是什么类型,就是通过这个type来判断的
zvalue_value 
又是什么类型的呢?它是一个联合体,定义如下:
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;
} zvalue_value;
看见没, 用一个联合体就把php中的数据类型都定义出来了
zend_uchar type 
变量类型定义, 在zend.h 中,定义了下面几种类型:
#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
#define IS_CONSTANT 8
#define IS_CONSTANT_ARRAY 9
#define IS_CALLABLE 10
zend_uint refcount__gc 
这个跟变量的垃圾回收有关, php5.2 等以及以前用引用计数来进行垃圾回收,php5.3 以后引入了新的垃圾回收算法Concurrent Cycle Collection in Reference Counted Systems,这个解决了循环引用的问题
其他的zend_uchar,zend_uint 等都是封装 c 语言里面的类型
zend/zend_types.h 中定义
typedef unsigned char zend_bool;
typedef unsigned char zend_uchar;
typedef unsigned int zend_uint;
typedef unsigned long zend_ulong;
typedef unsigned short zend_ushort;
源码研究:php变量的更多相关文章
- zepto源码研究 - zepto.js - 1
		
简要:网上已经有很多人已经将zepto的源码研究得很细致了,但我还是想写下zepto源码系列,将别人的东西和自己的想法写下来以加深印象也是自娱自乐,文章中可能有许多错误,望有人不吝指出,烦请赐教. 首 ...
 - underscore.js源码研究(6)
		
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
 - underscore.js源码研究(5)
		
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
 - underscore.js源码研究(2)
		
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
 - Chrome自带恐龙小游戏的源码研究(六)
		
在上一篇<Chrome自带恐龙小游戏的源码研究(五)>中实现了眨眼睛的恐龙,这一篇主要研究恐龙的跳跃. 恐龙的跳跃 游戏通过敲击键盘的Spacebar或者Up来实现恐龙的跳跃.先用一张图来 ...
 - 从源码研究如何不重启Springboot项目实现redis配置动态切换
		
上一篇Websocket的续篇暂时还没有动手写,这篇算是插播吧.今天讲讲不重启项目动态切换redis服务. 背景 多个项目或微服务场景下,各个项目都需要配置redis数据源.但是,每当运维搞事时(修改 ...
 - java io 源码研究记录(一)
		
Java IO 源码研究: 一.输入流 1 基类 InputStream 简介: 这是Java中所有输入流的基类,它是一个抽象类,下面我们简单来了解一下它的基本方法和抽象方法. 基本方法: publ ...
 - org.reflections 接口通过反射获取实现类源码研究
		
org.reflections 接口通过反射获取实现类源码研究 版本 org.reflections reflections 0.9.12 Reflections通过扫描classpath,索引元数据 ...
 - OAuth2学习及DotNetOpenAuth部分源码研究
		
OAuth2学习及DotNetOpenAuth部分源码研究 在上篇文章中我研究了OpenId及DotNetOpenAuth的相关应用,这一篇继续研究OAuth2. 一.什么是OAuth2 OAuth是 ...
 - Android开源项目 Universal imageloader 源码研究之Lru算法
		
https://github.com/nostra13/Android-Universal-Image-Loader universal imageloader 源码研究之Lru算法 LRU - Le ...
 
随机推荐
- Linux大棚命令记录
			
查看系统支持的shell: cat /etc/shells 查看当前系统用的shell: echo $SHELL 从bash切换到zsh: 先yum安装,然后 chsh -s /bin/zsh ,退 ...
 - 实践简单的项目WC
			
#include<iostream> #include<fstream> #include<string> #include<Windows.h> us ...
 - 【个人阅读】软件工程M1/M2做一个总结
			
1.以前博客链接 http://www.cnblogs.com/penglinjiang/p/4027850.html http://www.cnblogs.com/penglinjiang/p/40 ...
 - Linux内核读书笔记第三周 调试
			
内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态. 也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态. 用户态程序和内核交互,用户态程序的各种状态,错误等可以由内核来 ...
 - The Contest CodeForces - 813A (思维)
			
Pasha is participating in a contest on one well-known website. This time he wants to win the contest ...
 - book项目分析
			
需求1:用户注册 需求如下: 1)访问注册页面 2)填写注册信息,提交给服务器 3)服务器应该保存用户 4)当用户已经存在----提示用户注册 失败,用户名已存在 5)当用户不存在-----注册成功 ...
 - 第八章Jdk代理 cglib代理
			
什么是代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这 ...
 - ASP.NET MVC缓存使用
			
局部缓存(Partial Page) 1.新建局部缓存控制器: public class PartialCacheController : Controller { // GET: /PartialC ...
 - loadrunner报错
			
Action.c(1516): Error -27727: Step download timeout (120 seconds) has expired when downloading resou ...
 - Spring各个jar包的作用
			
Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects:Spring提供的对AspectJ框架的整合Spring Beans:Spring I ...