PHP 使用技巧之变量
众所周知,
PHP 与其他脚本语言一样,属于弱变量类型的语言。同时 PHP 本身也是通过 C
语言来实现。本文主要介绍
PHP 内部是如何实现弱变量类型的,并且据此分析在 PHP 开发
中需要注意的一些使用技术。其中会重点分析
PHP 中的 copy on write 机制和引用相关方面
的话题。
如何实现弱变量
在了解
PHP 实现弱变量类型之前,可以先思考下:如何通过 C/C++来实现弱变量类型的效
果呢?
这个问题我在
BIT 培训课上基本上有两种答案:
方法
1:采用 C++的继承机制。首先定义一个基础类型
1
Class Var
2
{
3
}
然后基于
Var,派生出不同的子类型 IntVar/FloatVar/StringVar 等等。
方法
2:基于 C 语言的 Struct。其中一个字段用于标识类型,另外一个字段用于存储数据,
由于数据要是各种类型,所以通常需要采用指针
比如:
4
struct var {
5
Int type;
6
Void *data;
7
};
两种思路本身并没有太大区别,也都基本上能够满足需求。在
PHP 中采用了第二种思路,
并且做了比较多的优化。在
PHP 中,所有的变量都会对应同一种类型 zval,其中 zval 也就
是
struct _zval_struct,具体定义如下:
8
typedef union _zvalue_value {
9
long lval; /* long value */
10
double dval; /* double value */
11
struct {
12
char *val;
13
int len;
14
} str;
15
HashTable *ht; /* hash table value */
16
zend_object_value obj;
17
} zvalue_value;
18
struct _zval_struct {
19
/* Variable information */
20
zvalue_value value; /* value */
21
zend_uint refcount;
22
zend_uchar type; /* active type */