前言:本来这一章是不想写的,引文关于数据类型这章内容,大多讲的都是一些PHP内部的处理,对于我们平时开发PHP用处不是特别大,我们也可以不用去确切的了解。然而今天的项目进度做完了,看看还有写时间,想着也别浪费么,那就简单写一些,就当是联系一些自己写文章的能力了吧!
正文开始:
数据类型这个东西吧,但凡是高级语言,肯定是离不开的,这样一来,这个东西其实就是编程的最基础的东西了,其实你如果懂了一们语言的数据类型后,其他的语言大同小异。
首先说一下PHP中的变量类型吧!这个东西我隐约记得我再一次的面试中有面试管问过我,那我就重点说一下
PHP的变量类型主要分为三类:标量类型,复合类型,特殊类型。
标量类型有:字符串(string),整形(int),浮点型(double),布尔型(bool)
复合类型有:数组(array),对象(object)
特殊类型有:资源(resource),NULL
嗯,到这里基本就可以了,下面主要说了一下数据类型的内部实现。有兴趣可以看哈,没兴趣可以跳过了。
然后我们再来看一下PHP对于数据类型的内部实现吧
重点说两个概念:zval,zend_value
先看zval的源码:
struct _zval_struct {
zend_value value; /* value */
union {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar type, /* active type */
zend_uchar type_flags,
zend_uchar const_flags,
zend_uchar reserved) /* call info for EX(This) */
} v;
uint32_t type_info;
} u1;
union {
uint32_t var_flags;
uint32_t next; /* hash collision chain */
uint32_t cache_slot; /* literal cache slot */
uint32_t lineno; /* line number (for ast nodes) */
uint32_t num_args; /* arguments number for EX(This) */
uint32_t fe_pos; /* foreach position */
uint32_t fe_iter_idx; /* foreach iterator index */
} u2;
};
zend_value是用来保存具体的变量值,u1里面就一个v结构体与一个32为无符号的type_info,type_info的值是一个4字节的整型,每一个字节对应了v结构体中的一个变量。v结构体中的type是用来标识value的类型,type_flags是变量的内存管理。u2的话其实是用来凑数的,占了4个字节,里面存放的是一些特殊场景用的东西。先说一下为啥我刚刚说u2是用来凑数的,首先,在这个struct结构体中,value是占了8字节,u1是占了4字节,但是他们两个加起来并不是12字节的(内部怎么回事暂时不清楚,后面有机会再研究一下),然后因为系统内部会进行字节对齐,所以这个结构体会占用16字节,那放着4字节不用的话,就浪费了,所以就有了u2这个占4字节的联合体。
再就是zend_value这个东西了,先上源码:
typedef union _zend_value {
zend_long lval; /* long value */
double dval; /* double value */
zend_refcounted *counted;
zend_string *str;
zend_array *arr;
zend_object *obj;
zend_resource *res;
zend_reference *ref;
zend_ast_ref *ast;
zval *zv;
void *ptr;
zend_class_entry *ce;
zend_function *func;
struct {
uint32_t w1;
uint32_t w2;
} ww;
} zend_value;
这个东西我也就是对着书了解了一下,深究的话,我觉得暂时用处不大,那就知道这么个东西就行了-_-
今天就差不多写这些吧,后面的主要是一些转换的东西,都是设计内部运行的实现,现在看也没多大意思,就溜了溜了 哈哈哈