为什么引用相等性破裂?

时间:2019-11-20 19:04:17

标签: php

我有以下PHP代码,其中包含测试,以查看程序在哪里崩溃。目的是$ P1是对Players第一个元素的引用,然后$ P1G是对$ P1中某物的成员的引用。由于我不明白的原因,该程序死于“ a2a”。据我所知,在成员的引用中分配值不应导致引用不再相等。

$ Players是一个数组,$ P1是一个assoc数组。 (全部由PDO :: fetchAll制作并进一步开发信息),以及$ P1 = $ Players [0]。

据我了解,$ A === $ B表示A和B变量都指向同一个对象,因此,如果我将其赋给B,则===将变为false,但是如果我将其赋给$中的某物B然后它们应该保持指向同一对象,并且该对象被修改。与大多数现代语言相同。

但是,“ a2a”表示我误会了一些东西。我哪里出问题了?

function &pair_players0(&$Players, & $P1)
{
    $P = &$P1;
    $P1 === $Players[0] or die('a1');

    foreach ($P1['games'] as & $P1G)
    {
            $P === $P1 or die('stea');
            $P1G['opp'] = '2';
            $P1 === $Players[0] or die('a2a');
            echo $P1G['opp']. nl();
            break;
        }
    }
    $P1 === $Players[0] or die('a2');
 }

也许更重要的问题是:我如何使这条线不把事情搞砸:

            $P1G['opp'] = '2';

1 个答案:

答案 0 :(得分:2)

根据评论:

在其他语言中,通常通过比较数组的内存地址来确定数组的相等性,即array1 == array2array1 === array2仅在两个数组是同一实例的情况下才得出true内存中的同一阵列。创建相同的阵列克隆并将克隆与原始克隆进行比较(即使元素相同)也会导致评估false

在PHP中,数组的比较方式与许多其他编程语言中的比较方式不同。 PHP不会检查两个数组是否是同一实例,而是直接比较数组的内容。也就是说,两个相同的数组,即使它们是不同的实例,也将导致array1 == array2array1 === array2的计算结果为true。

换句话说,PHP中的数组是按值而不是引用进行比较的。实际上,PHP默认情况下也不会通过引用执行数组分配,而是创建给定数组的副本。

PHP中的对象是另一回事。使用==时,PHP将检查类,属性和属性值是否相同。使用===时,PHP将检查对象的实例是否相同。换句话说,对象可以选择通过值或引用进行比较。

牢记所有这些,您可以使用两种解决方案来解决需要通过引用进行比较的问题:

  1. 您可以将各个数组元素包装在对象中,这将允许===通过引用执行直接比较。
  2. 您可以向每个数组元素添加唯一的ID值,然后比较这些ID而不是整个数组。