美文网首页
php 的数组

php 的数组

作者: 与子笑 | 来源:发表于2020-08-31 08:10 被阅读0次

php数组在 zval 中的联合体中是一个指针,这个指针指向的是一张哈希表,这个哈希表对应一个或多个 zval 结构体。

比如$a = array('a','b','c');

会产生一个结构体,这个结构体的联合体会有一个指针,指向一张哈希表,这张哈希表存着三条记录,可以简单的将哈希表理解为一个关联数组,一共有三个键值对,0对应着一个 zval 结构体的内存地址,这个 zval 的联合体内的值为a。

$a = array('a','b','c');
$b = $a;

以上为传值赋值,会产生几个结构体呢,应该是四个结构体,全局的符号表中会有两条记录。

如果在这两句后面加上 $a[0]=1; 内存中的这两个变量会如何变化呢,这点与普通类型的变量不同。

当传值赋值时,有行为会改变结构体的话会分裂,在数组这里,分裂的仅仅是一张哈希表。

也就是说上面三句代码执行,将会多出一张哈希表,这张哈希表是 $b 的,这个$b 的哈希表中的键1和键2其实还是指向的 $a 的键1和键2指向的 zval 的地址,键0将重新指向一个新产生的值为1的 zval 中。

数组键的引用赋值引发的一个现象

$a = array(1,2,3);
$b = &$a[1];
$c = $a;
$a[1] = 5;
echo $c[1];

此时实际上输出的就是5了,因为 $b 的引用赋值已经将基础单元值为2的 zval 结构体的类型改为了引用类型,而 php 只会去判断第一层的 zval 类型,所以导致 $a$c 指向的还是同一张符号表。

以上说的符号表是全局符号表,有全局就肯定也有局部,局部符号表指的是程序进行过程中遇到的自定义函数里的变量存放的地方。

函数里的局部符号表就存在函数的结构体里,函数中的静态变量存放在 op_array 里,也是一个指针指向一张符号表。

而常量单独在整个内存中占用一张符号表。
原文链接:php的数组-PHP

相关文章

  • php基础精粹

    PHP php数组 php数组之索引数组初始化 PHP数组之索引数组赋值 PHP数组之访问索引数组内容 PHP数组...

  • php哈希冲突攻击解析

    一段攻击代码 插入结果 php5(5.2) php7 php 数组的实现 php 中的数组是 php 中非常好用的...

  • php入门--数组

    在 PHP 中,array() 函数用于创建数组: 数值数组 在 PHP 中,有三种类型的数组:数值数组 - 带有...

  • php多维混合数组转一维数组的函数

    php多维混合数组转一维数组的函数 php语言本身没有将多维数组转为一维数组的函数,但是我们可以自己写一个php函...

  • PHP之each()函数输出空白问题

    each()函数 (PHP 4, PHP 5, PHP 7) each — 返回数组中当前的键/值对并将数组指针向...

  • 1.2 PHP数组

    PHP手册:Array 数组 简介在PHP手册中对Array数组的描述是这样的:PHP 中的数组实际上是一个有序映...

  • 浅析PHP数组的实现

    一. PHP数组特点介绍 php数组可谓是php的核心,其key=>value的存储结构,让我们处理数据可以...

  • PHP常用数组排序算法

    title: PHP常用数组排序算法tags: [PHP,数组,排序,算法] 这几天写到的代码中,用到了许多对数组...

  • json在js与php解析对应关系

    json在js与php解析后有所不同,php的索引数组对应js的数组,php的关联数组对应js的对象。你要是想让j...

  • PHP Array

    php的存储在内部是通过hashtable实现的,所以可以认为PHP的数组只有关联数组,且数组有很多用途:数组、栈...

网友评论

      本文标题:php 的数组

      本文链接:https://www.haomeiwen.com/subject/gygsjktx.html