[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型
来源:互联网 发布:2016年鞍山中考大数据 编辑:程序博客网 时间:2024/05/29 07:56
第一节:变量的结构和类型
类型:
如:字符串,数组,对象等
粗略分为:
强类型:一旦定义类型,不得改变类型,仅仅可以改变值,需要类型转换。
弱类型:一个变量可以表示任意的数据类型。是一个双刃剑。
官方的php变量内部实现:使用数据结构zval来保存,这个结构同时表示php中的各种数据类型,它不仅仅包含变量的值,也包含变量的类型。这就是PHP弱类型的核心。
zval结构具体是如何实现弱类型的呢?一探究竟!
PHP的变量类型及存储结构
PHP在声明或使用变量的时候,并不需要显示指明其数据类型。
PHP的8种类型:
标量类型:boolen,integer,float(double),string
复合类型:array,object
特殊类型:resource,NULL
官方PHP是C实现的,而C是强类型的语言,具体是怎么实现的呢?????
变量存储结构
变量的值存储到以下所示zval结构体中。zval结构体定义在Zend/zend.h文件,其结构如下:
typedef struct _zval_struct zval;...struct _zval_struct{ // 变量信息 zvalue_value value;// 值------------------->变量具体的值 zend_uint refcount__gc;------------------->变量引用计数 zend_uchar type;// 数据类型--------------->变量的具体类型 zend_uchar is_ref__gc;---------------------->表示是否为引用}
在php5.3之后,引入了新的垃圾收集机制,修改如上例子。
此处注意:变量值的类型是 zvalue_value 的数据类型。接下来我们就说一下这个 zvalue_value类型
变量的类型:
对于定义上面的 zend_uchar type可以的取值为:
IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE,IS_STRING,IS_ARRAY,IS_OBJECT,IS_RESOURCE,IS_CONSTANT,IS_CONSTANT_ARRAY
zvalue_value的结构体定义如下:
typedef union _zvalue_value{ long lval; double dval; struct { char *val; int len; } HashTable *ht; zend_object_value obj}zvalue_value;
说明:为什么使用联合体,而不是结构体:因为php的一个变量同时只能属于一种类型。如果使用结构体空间浪费比较大,这种成本小,收益大。
php变量类型对应的具体的方式
一般类型
变量类型 宏
boolean: ZVAL_BOOL 布尔型/整型的变量值存储于(zval).value.lval中,其类型也会相应的IS_*进行存储
integer ZVAL_LONG
float ZVAL_DOUBLE
null ZVAL_NULL NULL值的变量不需要存储,只需要把zval.type标识为IS_NULL
resource ZVAL_RESOURCE 资源类型的存储与其它一般变量没什么区别,初始化及存取实现不同。
字符串string
字符串存储,会多一个字符串的长度,
struct{ char *val; int len;}str;
说明:C里面的字符是\0 结尾的,PHP这样做就是为了空间换时间。
数组
数据是存放在zval.ht字段中的。它是 HashTable实现的。
对象
对象的内部实现是一种复合数据类型。
typedef struct _zend_object_value{ zend_object_handle handle; zend_object_handler *handlers;}zend_object_value;
总结来说:为什么php能够实现弱类型,就是,其实每一个php变量的具体实现都是一个全部类型的集合的联合体。哈哈!
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--预定义变量
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--静态变量
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--HashTable-1
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--HashTable
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--链表
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--常量
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--PHP的哈希实现
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--类型提示的实现
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的生命周期
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的作用域
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的赋值和销毁
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--数据类型转换
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--简略
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--global语句
- [李景山php] 深入理解PHP内核[读书笔记]--第五章:类和面向对象 --类的结构和实现
- 静态变量 深入理解php内核
- 深入理解PHP原理之变量结构
- live templates语法
- 前后端分离的交互式开发模式
- Selenium-java(XML-元素管理篇)
- Android面试题-Android源码编译实现静默安装和静默偷拍
- Vijos P1772 巧妙填数【进制+置换】
- [李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型
- [svc]免费ssl实践
- 用户、组或角色 在当前数据库中已存在
- 初识MongoDB一
- C#159课的主要内容
- selenium常用资源的阿里镜像链接
- 指针、数组和字符串
- android 可以用来写代码的代码(JavaPoet)
- Oracle数据库:实例、用户、表、表空间