【PHP7内核剖析】——数据类型

前言:本来这一章是不想写的,引文关于数据类型这章内容,大多讲的都是一些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;

这个东西我也就是对着书了解了一下,深究的话,我觉得暂时用处不大,那就知道这么个东西就行了-_-

今天就差不多写这些吧,后面的主要是一些转换的东西,都是设计内部运行的实现,现在看也没多大意思,就溜了溜了  哈哈哈

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值