PHP是一门弱语言,也就说PHP的一个变量能够保存任意类型的变量,PHP是用C语言实现的,而C语言是一个强类型的语言,每一个变量都有固定的类型,不能随意改变变量的类型(虽然能够经过强制类型转换,可能会出问题)。在zend引擎中的实现:web
引用的是PHP 5的源码:数据库
打开zend.h 会发现定义了以下的结构体:数组
typedef struct _zval_struct zval;安全
typedef union _zvalue_value {函数
long lval; /* long value */学习
double dval; /* double value */ui
struct {spa
char *val;指针
int len;orm
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
zend_ast *ast;
} zvalue_value;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};
其中 zval 就是PHP的变量的底层实现,zval是用结构体来实现的。
在zvalue_value中:
lval 是long类型数据,便是C语言中long。
dval 是double类型数据,便是C语言中double。
str 是一个结构体,成员变量var是char类型的指针,指向一个字符数组的首地址,为了数据安全,用len告诉系统要取多长的数据。
ht 是一个hash表结构,是为了存储数组;
obj 是为了存储对象类型;其中zend_object_value 就是zend为了存储对象而定义的结构体。
ast 是PHP 5.6之后才有的,是为了存储常量;
在_zval_struct中,
value 便是上述所说的zvalue_value,也就是存储的数据;
refcount__gc 便是变量的引用数,变量引用计算器。
type 变量的类型,为了保存当前所存储的数据,是哪个类型的数据;经常使用类型以下所示:
#define IS_NULL 0
#define IS_LONG 1
#define IS_DOUBLE 2
#define IS_BOOL 3
#define IS_ARRAY 4
#define IS_OBJECT 5
#define IS_STRING 6
#define IS_RESOURCE 7
is_ref__gc 变量是否被引用。
对变量类型的解析:
IS_NULL |
0 |
空 |
IS_LONG |
1 |
long类型变量 |
IS_DOUBLE |
2 |
double类型变量 |
IS_BOOL |
3 |
布尔变量 |
IS_ARRAY |
4 |
数组 |
IS_OBJECT |
5 |
对象 |
IS_STRING |
6 |
字符串 |
IS_RESOURCE |
7 |
资源类型变量 |
关于资源类型的变量:资源类型是一种特殊的变量,保存了到外部资源的一个引用。好比数据库的链接,打开文件,图形画布区域;
资源类型本质上存储是一个整数,也就是resource ID ,zend能够根据这个ID去找到最终所须要的数据;
例如:$file_source = fopen(“a.txt”,”r”);
能够用is_resource()函数测定一个变量是不是资源,函数get_resource_type()则返回该资源的类型。
关于变量的赋值会有 写时复制机制。
更过的进阶技术能够关注公众号:进阶的脚步 回复:学习资料 有惊喜哦