您的位置:

聊聊php数组底层是如何实现的(php数组是怎么实现的)

本文目录一览:

PHP的数组底层是怎么实现的

PHP之所以发现这么迅速,有很大原因是因为数组数据非常好处理,而且它可以存储其他类型的数据

数组的值存储在zvalue_value.ht字段中,ht是一个HashTable的数据

有关于HashTable的知识请移步 HASH表和变量

我们来详细说一下数组

PHP里面所有的数据都离不开zval和HashTable,

一个PHP很简单的数组初始化,

在C语言里面实现的却没有那么简单.

经过简单分析,找到数组的初始化的opcode

求各位大神帮帮忙,PHP $_post 数组 怎么实现

有点没看明白你提问的目的!

php数组的定义很宽泛,不需要预先定义变量,可以直接存放数据,有两种形式:索引数组(不指定键,系统自动分配数字键)、关联数组(自定义键,指定键)!

例如:想要获得如下结构的二维数组(关联数组)

[

  'A' = [

        'type' = 'TYPE_SINGLE', 

        'day' = 'DAY May 12'

        ], 

  'B' = [

        'type' = 'TYPE SINGLE_2', 

        'day' = 'DAY May 13'

        ],

  'C' = [

        'type' = 'TYPE SINGLE_3', 

        'day' = 'DAY May 14'

        ]

]

php定义代码:

//第1种

$abc = [

  'A' = [

        'type' = 'TYPE_SINGLE', 

        'day' = 'DAY May 12'

        ], 

  'B' = [

        'type' = 'TYPE SINGLE_2', 

        'day' = 'DAY May 13'

        ],

  'C' = [

        'type' = 'TYPE SINGLE_3', 

        'day' = 'DAY May 14'

        ]

];

//第2种

$abc2 = [];//定义并重置变量,此行可不写

$abc2['A']['type'] = 'TYPE_SINGLE';

$abc2['A']['day'] = 'DAY May 12';

$abc2['B']['type'] = 'TYPE_SINGLE_2';

$abc2['B']['day'] = 'DAY May 13';

$abc2['C']['type'] = 'TYPE SINGLE_3';

$abc2['C']['day'] = 'DAY May 14';

//第3种(1、2的混合用法)

$abc3['A'] = ['type' = 'TYPE_SINGLE', 'day' = 'DAY May 12'];

$abc3['B'] = ['type' = 'TYPE_SINGLE_2', 'day' = 'DAY May 13'];

$abc3['C'] = ['type' = 'TYPE_SINGLE_3', 'day' = 'DAY May 14'];

以上三种写法是常用写法,还有其他形式,php数组功能很强大,可以存放任意数据类型,写法也很随意!$abc、$abc2、$abc3 数据结构相同,但是$abc会重置内部结构。

注:$_POST 是全局变量,适合从中获取(请求)数据,不建议你修改其内部数据结构,防止键名冲突,破坏全局变量的结构。如果你修改了$_POST,的确,$_POST['A']['type'] 能得到字符串'TYPE_SINGLE'!

PHP变量的底层实现

我们解压PHP的源码包, 看到如下的目录

其中,

最核心的---Zend目录, 这是zend虚拟的实现. 包括栈,数据类型,编译器等,都在这实现.

最主要的main --PHP的一些内建函数,最主要函数都在这里放着.

最大的一个目录ext -- PHP的扩展.

PHP的大部分功能,都是以extenstion形式来完成的.

如果你开发了一个扩展,也放在ext目录下.

Zend对变量的表示:

答: zend实现了 zval结构体

{

value: [联合体] ,联合体的内容可能是C语言中的long,double,hashtable...

type:变量类型 , IS_NULL,IS_BOOL,IS_STRING...... IS_RESOURCE

refcount_gc

is_ref_gc

}

如:

$a = 3;

{

value : [long lval = 3]

type: IS_LONG

}

$a = 3.5

{

value: [double dval = 3.5]

type:IS_DOUBLE

疑问:

PHP中有8种数据类型,为什么zval-value 联合体中,只有5种?

答:

1: NULL,直接 zval-type = IS_NULL,就可以表示,不必设置  value的值.

2: BOOL型 , zval-type = IS_BOOL, 再设置 zval.value.lval = 1/0;

3: Resourc型 ,资源型 往往是服务器上打开的一个接口,如果 文件读取接口.

zval-type = IS_RESOURCE, zval-tyoe.lval =服务器上打开的接口的编号

发现:

PHP中,字符串类型,长度是已经缓存的,调用strlen时,系统可以直接返回其长度,不必计算.