p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica; min-height: 17.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #006141; min-height: 15.0px }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #006141 }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #4e9072 }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #931a68 }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }
p.p8 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px }
p.p9 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #0326cc }
p.p10 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #931a68; min-height: 15.0px }
p.p11 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Arial; color: #333333 }
span.s1 { }
span.s2 { color: #931a68 }
span.s3 { }
span.s4 { text-decoration: underline; color: #0326cc }
span.s5 { text-decoration: underline }
span.s6 { color: #006141 }
span.s7 { text-decoration: underline }
span.s8 { color: #4e9072 }
span.s9 { color: #000000 }
span.s10 { background-color: #fffb00 }
span.Apple-tab-span { white-space: pre }
table.t1 { border-collapse: collapse }
td.td1 { width: 176.7px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #bbbbbb #bbbbbb #bbbbbb #bbbbbb }
td.td2 { width: 98.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #bbbbbb #bbbbbb #bbbbbb #bbbbbb }
td.td3 { width: 102.9px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #bbbbbb #bbbbbb #bbbbbb #bbbbbb }

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

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

PHP 变量的实现原理的更多相关文章

  1. 【java】ThreadLocal线程变量的实现原理和使用场景

    一.ThreadLocal线程变量的实现原理 1.ThreadLocal核心方法有这个几个 get().set(value).remove() 2.实现原理 ThreadLocal在每个线程都会创建一 ...

  2. volatile、Synchronized实现变量可见性的原理,volatile使用注意事项

    变量不可见的两个原因 Java每个线程工作都有一个工作空间,需要的变量都是从主存中加载进来的.Java内存模型如下(JMM): 线程访问一个共享的变量时,都需要先从主存中加载一个副本到自己的工作内存中 ...

  3. 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理

    前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文.想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能 ...

  4. day 变量的赋值原理 变量的命名规则

    print(3*4*5*6/2) #简单的计算输出 x=3 y=4 print("x乘以y=",x*y) #运行5分钟 = 12 print(x*y) #在运行5分钟 = 12 ' ...

  5. PHP变量的实现原理【转】

    PHP是一门弱语言,也就说PHP的一个变量可以保存任意类型的变量,PHP是用C语言实现的,而C语言是一个强类型的语言,每个变量都有固定的类型,不能随意改变变量的类型(虽然可以通过强制类型转换,可能会出 ...

  6. 8.变量内存CPU原理

    编译器先明确是什么类型,然后明确变量名,变量表管理所有的变量,不在变量表内部的变量不能引用.每个变量对应一整块内存 a+1所计算出来的值在寄存器中,只有变量可以被赋值,变量必须在内存里面 c语言内嵌汇 ...

  7. Java环境变量的操作系统原理[浅谈]

    从知乎摘抄过来的文章,图没有复制过来,当作自己的笔记.其中我认为重要的部分(涉及操作系统的)已经加粗了. 本文源自:你应该知道的 Windows 环境变量 - 麓山南人的文章 - 知乎 https:/ ...

  8. javascript中var同时声明多个变量时的原理是什么?

    <script> function show(){ var a=b=c=d=5; } show(); alert(a);//弹a时报错(not defined),而b.c.d都能弹出5 & ...

  9. 【原】结构体包含CString类型成员变量出错的原理

    问题如下:我定义了如下的一个结构体: typedef struct{   CString csText;}MyStruct; 并有如下的程序段1:MyStruct * p=NULL;p=(MyStru ...

随机推荐

  1. php 抽奖概率 随机数

    <?php $prize_arr = array( '0' => array('id' => 1, 'title' => 'iphone5s', 'v' => 5), ' ...

  2. IOS开发之纯代码界面--基本控件使用篇 ┊

    http://www.cocoachina.com/bbs/read.php?tid=131516

  3. MyBatis动态传入表名,字段名参数的解决办法

    原文:http://blog.csdn.net/xichenguan/article/details/50393748 要实现动态传入表名.列名,需要做如下修改 添加属性statementType=& ...

  4. 开地址哈希表(Hash Table)的原理描述与冲突解决

    在开地址哈希表中,元素存放在表本身中.这对于某些依赖固定大小表的应用来说非常有用.因为不像链式哈希表在每个槽位上有一个"桶"来存储冲突的元素,所以开地址哈希表需要通过另一种方法来解 ...

  5. tomcat 部署war项目

    前提是 jdk环境已配好 把项目war包放到tomcat的webapps目录下 启动tomcat: 这里我把8080端口修改成了80 IP也修改了 如果没修改直接输入localhost:8080/te ...

  6. underscore.js 源码阅读 一 整体结构

    // 整个underscore的实现包在一个立即执行函数中,避免污染全局对象 // 通过call(this)来入全局变量 (function() { // 缓存this var root = this ...

  7. linkin大话设计模式--抽象工厂

    linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了  现在要是还想彻底解耦的话怎么办呢 ...

  8. libev学习笔记

    转 libev的使用--结合Socket编程 作者:cxy450019566 之前自己学过一些libev编程的基础,这次写压测刚好用上了,才算真正动手写了些东西,在这里做一些总结.写这篇文章是为了用浅 ...

  9. 【转】sed & awk常用正则表达式

    正则表达式元字符 正则表达式中有两种基本元素: 以字面值或变量表示的值(如.代表任意单个字符). 操作符(如*代表将前面的字符重复任意次). 元字符汇总 特殊字符 用途 . 匹配除换行符以外的任意单个 ...

  10. crontab 定时任务守护程序,停止服务器时出现 job for * canceled

    (1)首先要在程序启动的时候加入定时任务到crontab #! /bin/shmkdir -p /home/apps/components/ams/ 2>/dev/nullcp ./amswat ...