或许你知道,或许你不知道,PHP是一个弱类型,动态的脚本语言。所谓弱类型,就是说PHP并不严格验证变量类型(严格来讲,PHP是一个中强类型语言,这部分内容会在以后的文章中叙述),在申明一个变量的时候,并不需要显示指明它保存的数据的类型:

$var = 1; //int

$var = "laruence"; //string

$var = 1.0002; //float

$var = array(); // array

$var = new Exception('error'); //object;

动态语言,就是说,PHP的语言结构在运行期是可以改变的,比如我们在运行期require一个函数定义文件,从而导致语言的函数表动态的改变。

所谓脚本语言,就是说,PHP并不是独立运行的,要运行PHP我们需要PHP解析器:

/usr/bin/php -f example.ph

我前面的文章中已经讲过,PHP的执行是通过Zend engine(ZE, Zend引擎), ZE是用C编写的,大家都知道C是一个强类型语言,也就是说,在C中所有的变量在它被声明到最终销毁,都只能保存一种类型的数据。 那么PHP是如何在ZE的基础上实现弱类型的呢?

在PHP中,所有的变量都是用一个结构-zval来保存的, 在Zend/zend.h中我们可以看到zval的定义:

typedef struct _zval_struct {

zvalue_value value;

zend_uint refcount;

zend_uchar type;

zend_uchar is_ref;

} zval;

其中zvalue_value是真正保存数据的关键部分,现在到了揭晓谜底的时候了,PHP是如何在ZE的基础上实现弱类型的呢? 因为zvalue_value是个联合体(union),

typedef union _zvalue_value {

long lval;

double dval;

struct {

char *val;

int len;

} str;

HashTable *ht;

zend_object_value obj;

} zvalue_value;

那么这个结构是如何储存PHP中的多种类型的呢?

PHP中常见的变量类型有:

1. 整型/浮点/长整型/bool值 等等

2. 字符串

3. 数组/关联数组

4. 对象

5. 资源

PHP根据zval中的type字段来储存一个变量的真正类型,然后根据type来选择如何获取zvalue_value的值,比如对于整型和bool值:

zval.type = IS_LONG;//整形

zval.type = IS_BOOL;//布尔

就去取zval.value.lval,对于bool值来说lval∈(0|1);

如果是双精度,或者float则会去取zval.value的dval。

而如果是字符串,那么:

zval.type = IS_STRIN

这个时候,就会取:

zval.value.str

而这个也是个结构,存有C分格的字符串和字符串的长度。

而对于数组和对象,则type分别对应IS_ARRAY, IS_OBJECT, 相对应的则分别取zval.value.ht和obj

比较特别的是资源,在PHP中,资源是个很特别的变量,任何不属于PHP内建的变量类型的变量,都会被看作成资源来进行保存,比如,数据库句柄,打开的文件句柄等等。 对于资源:

type = IS_RESOURC

这个时候,会去取zval.value.lval, 此时的lval是个整型的指示器, 然后PHP会再根据这个指示器在PHP内建的一个资源列表中查询相对应的资源(这部分的内容,我以后会单独开一个篇文章来介绍),目前,你只要知道此时的lval就好像是对应于资源链表的偏移值。

ZEND_FETCH_RESOURCE(con, type, zval *, default, resource_name, resource_type);

借用这样的机制,PHP就实现了弱类型,因为对于ZE的来说,它所面对的永远都是同一种类型,那就是zval。

php variables,浅析PHP原理之变量(Variables inside PHP)相关推荐

  1. 深入理解PHP原理之变量(Variables inside PHP)

    或许你知道,或许你不知道,PHP是一个弱类型,动态的脚本语言.所谓弱类型,就是说PHP并不严格验证变量类型(严格来讲,PHP是一个中强类型语言,这部分内容会在以后的文章中叙述),在申明一个变量的时候, ...

  2. 深入理解PHP原理之变量分离/引用(Variables Separation)

    引自: http://www.laruence.com/ [风雪之隅 ] 在前面的文章中我已经介绍了PHP的变量的内部表示(深入理解PHP原理之变量(Variables inside PHP)),以及 ...

  3. Python编程基础:第一节 变量Variables

    第一节 变量Variables 前言 字符串类型的变量(str) 整数类型的变量(int) 浮点类型的变量(float) 布尔类型的变量(bool) 前言 变量,简而言之就是一个装有数据的容器,它可以 ...

  4. 5、流程变量Variables

    流程变量Variables 1.流程变量 2.变量注意事项,程序设置的变量值尽量提前手动规则校验 3.流程中添加变量,通过变量控制流程走向 3.1.创建流程时,设置变量判断 3.2.开启流程时设置变量 ...

  5. MySQL数据库(28):变量 variables

    变量 variables MySQL本质是一种编程语言 1.系统变量 对所有用户客户端都有效 1.1.查看系统变量 1.方式一 show variables [like 'pattern']; 示例 ...

  6. 深入理解PHP原理之变量作用域

    作者:laruence(http://www.laruence.com/) 地址: http://www.laruence.com/2008/08/26/463.html                ...

  7. 浅析bootstrap原理及优缺点

    网格系统的实现原理,是通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最后结合媒体查询,就制作出了强大的响应式网格系统 网格系统的实现原理,是通过定义容器 ...

  8. 手把手带你学会Odoo OWL组件开发(5):浅析OWL原理

    [本系列内容直达:] 手把手带你学习Odoo OWL组件开发(1):认识 OWL 手把手带你学会Odoo OWL组件开发(2):OWL的使用 手把手带你学会Odoo OWL组件开发(3):核心内容指南 ...

  9. Learn Java - Chapter 1 变量(Variables)-数组(Arrays)

    为什么80%的码农都做不了架构师?>>>    Java数组在被创建的时候确定数组长度.索引下标从0开始. 1.数组定义及初始化 int[] anArray;//定义 anArray ...

最新文章

  1. php non numeric,PHP 7.1 的 A non-numeric value encountered 错误和解决方法
  2. midi api java_Java声音api – 扫描MIDI设备
  3. JavaScript Array.prototype.some()
  4. Verilog | HDL 音乐盒设计(代码类)
  5. html写出日出,描写日出优美句子
  6. ubuntu生成密钥和证书_基于浏览器的密钥生成以及与浏览器的密钥/证书存储的交互...
  7. Java 中判断连接Oracle数据库连接成功
  8. PHP设计模式练习——制作简单的投诉页面
  9. 炒股的最终下场(搞笑趣图)
  10. 烤烟发病叶片高光谱特征分析
  11. 仅需6道题轻松掌握SciPy空间计算基础 | Python技能树征题
  12. 暴力解决配置HTTPS后无法使用Hermit
  13. php小插件,PHPStrom中一些我收藏的小插件
  14. logback日志配置教程
  15. android模拟器录制视频教程,夜神安卓模拟器怎么录制视频 夜神安卓模拟器录制视频教程...
  16. Spring MVC 学习笔记 by starscream
  17. 北京移动电信联通校园卡,以及各种流量卡申请入口合辑!
  18. 转:衡量数据的离散程度
  19. 治愈系课程教材 第三课
  20. Python 关于图片处理PIL

热门文章

  1. 第一章:1.3:了解编译系统如何工作的好处
  2. MVC.NET:提供对字体文件.woff的访问
  3. String、Path、File、Directroy 常用方法总结
  4. [转载]用SQL语句添加删除修改字段
  5. 三层架构之抽象工厂加反射mdash;mdash;实现数据库转换
  6. oracle数据恢复
  7. ubuntu16.04安装FastDFS-5.08
  8. 基于 Vue 的轻量级静态网站生成器 VuePress
  9. 使用mysql导入数据
  10. Linux cannot remove 'XXX': Is a directory 解决办法