深入理解PHP原理之变量(Variables inside 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解析器:
我前面的文章中已经讲过,PHP的执行是通过Zend engine(ZE, Zend引擎), ZE是用C编写的,大家都知道C是一个强类型语言,也就是说,在C中所有的变量在它被声明到最终销毁,都只能保存一种类型的数据。 那么PHP是如何在ZE的基础上实现弱类型的呢?
- 深入浅出PHP(PHP Internals)
- 深入理解PHP原理之Opcodes
在PHP中,所有的变量都是用一个结构-zval来保存的, 在Zend/zend.h中我们可以看到zval的定义:
zvalue_value value;
zend_uint refcount;
zend_uchar type;
zend_uchar is_ref;
} zval;
其中zvalue_value是真正保存数据的关键部分,现在到了揭晓谜底的时候了,PHP是如何在ZE的基础上实现弱类型的呢? 因为zvalue_value是个联合体(union),
long lval;
double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
} zvalue_value;
那么这个结构是如何储存PHP中的多种类型的呢?
PHP中常见的变量类型有:
2. 字符串
3. 数组/关联数组
4. 对象
5. 资源
PHP根据zval中的type字段来储存一个变量的真正类型,然后根据type来选择如何获取zvalue_value的值,比如对于整型和bool值:
zval.type = IS_BOOL;//布尔值
就去取zval.value.lval,对于bool值来说lval∈(0|1);
如果是双精度,或者float则会去取zval.value的dval。
而如果是字符串,那么:
这个时候,就会取:
zval.value.str
而这个也是个结构,存有C分格的字符串和字符串的长度。
而对于数组和对象,则type分别对应IS_ARRAY, IS_OBJECT, 相对应的则分别取zval.value.ht和obj
比较特别的是资源,在PHP中,资源是个很特别的变量,任何不属于PHP内建的变量类型的变量,都会被看作成资源来进行保存,比如,数据库句柄,打开的文件句柄等等。 对于资源:
这个时候,会去取zval.value.lval, 此时的lval是个整型的指示器, 然后PHP会再根据这个指示器在PHP内建的一个资源列表中查询相对应的资源(这部分的内容,我以后会单独开一个篇文章来介绍),目前,你只要知道此时的 lval就好像是对应于资源链表的偏移值。
借用这样的机制,PHP就实现了弱类型,因为对于ZE的来说,它所面对的永远都是同一种类型,那就是zval。
ps:明天team出去building,我想着应该在走之前写点东西给我的blog reader来消磨周末。今天就简单先开个头,下一次,我将进一步介绍PHP的变量,作用域,以及变量的copy on write和change on write机制, 待续….
深入理解PHP原理之变量(Variables inside PHP)相关推荐
- php variables,浅析PHP原理之变量(Variables inside PHP)
或许你知道,或许你不知道,PHP是一个弱类型,动态的脚本语言.所谓弱类型,就是说PHP并不严格验证变量类型(严格来讲,PHP是一个中强类型语言,这部分内容会在以后的文章中叙述),在申明一个变量的时候, ...
- 深入理解PHP原理之变量分离/引用(Variables Separation)
引自: http://www.laruence.com/ [风雪之隅 ] 在前面的文章中我已经介绍了PHP的变量的内部表示(深入理解PHP原理之变量(Variables inside PHP)),以及 ...
- 深入理解PHP原理之变量作用域
作者:laruence(http://www.laruence.com/) 地址: http://www.laruence.com/2008/08/26/463.html ...
- php 生命变量,深入理解PHP原理之变量生命期(一)
对于PHP的中的数据来源, 不外乎有俩种: 1. 来自代码中 2. 来自外部(GET/POST/DB) 对于代码中的变量(也就是直接量)来说, 变量分配/赋值在编译期, 活跃在执行器, 在请求关闭期被 ...
- Python编程基础:第一节 变量Variables
第一节 变量Variables 前言 字符串类型的变量(str) 整数类型的变量(int) 浮点类型的变量(float) 布尔类型的变量(bool) 前言 变量,简而言之就是一个装有数据的容器,它可以 ...
- 深入理解浏览器原理和架构|硬核
本文用47张图带你了解「浏览器的发展史」.「浏览器的架构」.「浏览器的基本原理」以及 「浏览器的其它小知识」 ???? 正文开始 浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示HTML文档. ...
- 深入理解mybatis原理, Mybatis初始化SqlSessionFactory机制详解(转)
文章转自http://blog.csdn.net/l454822901/article/details/51829785 对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章 ...
- php opcodes 还原代码,深入理解PHP原理之Opcodes(PHP执行代码会经过的4个步骤是什么)...
深入理解PHP原理之Opcodes(PHP执行代码会经过的4个步骤是什么) 一.总结 一句话总结: 1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens) 2.Parsin ...
- C++实现爬虫,深入理解爬虫原理(最详细,最简单的教程)
前言: 我目前主要学习方向是c++,看到网上基本上都是用python写的爬虫,我也试过,确实非常方便,几行代码就能解决,但却就是因为python封装的太好,过于简单,使得很多人包括我最开始的时候,都很 ...
最新文章
- [轉]MS SQL Server启用AWE用查看内存使用情况
- asp.net网站安全常见问题与防范
- CRC生成多项式应该怎样定
- day05 selenium
- android 等待动画 库,android--AnimationDrawable实现等待动画效果
- 10款优秀的跨平台免费生产力软件[转]
- Mysql实现主从复制(一主双从)
- 商业WiFi“风来了”
- 静态绑定(前期绑定)
- json类型大小 mysql_MySQL数据类型 - JSON数据类型 (1)
- jemalloc java_jemalloc 5.0.0 全新版本发布,内存分配管理
- 【Unity3D游戏教程】记忆翻牌游戏
- 怎么设置计算机桌面壁纸,电脑桌面壁纸无法设置如何处理
- win10系统自带清除磁盘垃圾工具———磁盘清理工具
- 洛谷P5071 [YNOI2015]此时此刻的光辉 莫队+玄学优化+卡常QWQ
- android调用wcf服务的xml,Android调用WCF
- c#后端QQ通讯录(代码部分)
- Photoshop实用的快捷键分享
- ESP32 CAM CameraWebServer示例测试
- 三星激光打印机清零大全
热门文章
- python成绩统计_python学习-统计学生成绩-统计学生成绩
- linux at shell,shell 用at命令来计划执行作业
- 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并
- 【TensorFlow2.0】(5) 数学计算、合并、分割
- 数据库实验:数据库和表、查询、视图与安全性、存储过程及游标、触发器、综合实验-水果商店进阶
- java三段式if_Java几种常用的断言风格你怎么选?
- android组件什么时候加载到r文件,Android自定义加载loading view动画组件
- 在CentOS 6.3 64bit上安装ATS 5.3 LTS版本并测试
- 在UE4中创建CG动画 How to create a movie in Unreal Engine 4 using Metahuman
- Rocksdb 写流程,读流程,WAL文件,MANIFEST文件,ColumnFamily,Memtable,SST文件原理详解