或许你知道,或许你不知道,PHP是一个弱类型,动态的脚本语言。所谓弱类型,就是说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.php

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

首先要声明一点,如果你以前没有接触过PHP的源码分析,扩展开发。 如果你并不了解PHP的架构, 没有听说ZE,那么我建议你先看看我前面的文章,尤其推荐:

  • 深入浅出PHP(PHP Internals)
  • 深入理解PHP原理之Opcodes

在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_STRING

这个时候,就会取:
zval.value.str
而这个也是个结构,存有C分格的字符串和字符串的长度。

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

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

type = IS_RESOURCE

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

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

借用这样的机制,PHP就实现了弱类型,因为对于ZE的来说,它所面对的永远都是同一种类型,那就是zval。
ps:明天team出去building,我想着应该在走之前写点东西给我的blog reader来消磨周末。今天就简单先开个头,下一次,我将进一步介绍PHP的变量,作用域,以及变量的copy on write和change on write机制, 待续….

深入理解PHP原理之变量(Variables inside PHP)相关推荐

  1. php variables,浅析PHP原理之变量(Variables inside PHP)

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

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

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

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

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

  4. php 生命变量,深入理解PHP原理之变量生命期(一)

    对于PHP的中的数据来源, 不外乎有俩种: 1. 来自代码中 2. 来自外部(GET/POST/DB) 对于代码中的变量(也就是直接量)来说, 变量分配/赋值在编译期, 活跃在执行器, 在请求关闭期被 ...

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

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

  6. 深入理解浏览器原理和架构|硬核

    本文用47张图带你了解「浏览器的发展史」.「浏览器的架构」.「浏览器的基本原理」以及 「浏览器的其它小知识」 ???? 正文开始 浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示HTML文档. ...

  7. 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)

    文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章 ...

  8. php opcodes 还原代码,深入理解PHP原理之Opcodes(PHP执行代码会经过的4个步骤是什么)...

    深入理解PHP原理之Opcodes(PHP执行代码会经过的4个步骤是什么) 一.总结 一句话总结: 1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens) 2.Parsin ...

  9. C++实现爬虫,深入理解爬虫原理(最详细,最简单的教程)

    前言: 我目前主要学习方向是c++,看到网上基本上都是用python写的爬虫,我也试过,确实非常方便,几行代码就能解决,但却就是因为python封装的太好,过于简单,使得很多人包括我最开始的时候,都很 ...

最新文章

  1. [轉]MS SQL Server启用AWE用查看内存使用情况
  2. asp.net网站安全常见问题与防范
  3. CRC生成多项式应该怎样定
  4. day05 selenium
  5. android 等待动画 库,android--AnimationDrawable实现等待动画效果
  6. 10款优秀的跨平台免费生产力软件[转]
  7. Mysql实现主从复制(一主双从)
  8. 商业WiFi“风来了”
  9. 静态绑定(前期绑定)
  10. json类型大小 mysql_MySQL数据类型 - JSON数据类型 (1)
  11. jemalloc java_jemalloc 5.0.0 全新版本发布,内存分配管理
  12. 【Unity3D游戏教程】记忆翻牌游戏
  13. 怎么设置计算机桌面壁纸,电脑桌面壁纸无法设置如何处理
  14. win10系统自带清除磁盘垃圾工具———磁盘清理工具
  15. 洛谷P5071 [YNOI2015]此时此刻的光辉 莫队+玄学优化+卡常QWQ
  16. android调用wcf服务的xml,Android调用WCF
  17. c#后端QQ通讯录(代码部分)
  18. Photoshop实用的快捷键分享
  19. ESP32 CAM CameraWebServer示例测试
  20. 三星激光打印机清零大全

热门文章

  1. python成绩统计_python学习-统计学生成绩-统计学生成绩
  2. linux at shell,shell 用at命令来计划执行作业
  3. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并
  4. 【TensorFlow2.0】(5) 数学计算、合并、分割
  5. 数据库实验:数据库和表、查询、视图与安全性、存储过程及游标、触发器、综合实验-水果商店进阶
  6. java三段式if_Java几种常用的断言风格你怎么选?
  7. android组件什么时候加载到r文件,Android自定义加载loading view动画组件
  8. 在CentOS 6.3 64bit上安装ATS 5.3 LTS版本并测试
  9. 在UE4中创建CG动画 How to create a movie in Unreal Engine 4 using Metahuman
  10. Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解