PHPer都知道,PHP是一门弱类型语言。所谓弱类型是指,变量在声明时不需要指明存储的数据类型。
1 |
|
那么PHP是如何实现这种弱类型变量的呢?
PHP变量的定义
注:zval在PHP7中有所优化
在PHP中,所有的变量都是用一个结构-zval来保存的, 在Zend/zend.h中我们可以看到zval的定义:
1 | typedef struct _zval_struct { |
问题一、Zend引擎是如何用C实现这种弱类型的呢?
其中zvalue_value是真正保存数据的关键部分,现在到了揭晓谜底的时候了,PHP是如何在ZE的基础上实现弱类型的呢? 因为zvalue_value是个联合体(union)。
1 | typedef union _zvalue_value { |
问题二、Zend引擎是如何判别、存储PHP中的多种数据类型的呢?
_zval_struct.type中存储着一个变量的真正类型,根据type来选择如何获取zvalue_value的值。
1 | (Zend/zend.h) |
来看一个简单的例子:
1 |
|