本文目录一览:
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时,系统可以直接返回其长度,不必计算.