我有以下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';
答案 0 :(得分:2)
根据评论:
在其他语言中,通常通过比较数组的内存地址来确定数组的相等性,即array1 == array2
和array1 === array2
仅在两个数组是同一实例的情况下才得出true
内存中的同一阵列。创建相同的阵列克隆并将克隆与原始克隆进行比较(即使元素相同)也会导致评估false
。
在PHP中,数组的比较方式与许多其他编程语言中的比较方式不同。 PHP不会检查两个数组是否是同一实例,而是直接比较数组的内容。也就是说,两个相同的数组,即使它们是不同的实例,也将导致array1 == array2
和array1 === array2
的计算结果为true。
换句话说,PHP中的数组是按值而不是引用进行比较的。实际上,PHP默认情况下也不会通过引用执行数组分配,而是创建给定数组的副本。
PHP中的对象是另一回事。使用==
时,PHP将检查类,属性和属性值是否相同。使用===
时,PHP将检查对象的实例是否相同。换句话说,对象可以选择通过值或引用进行比较。
牢记所有这些,您可以使用两种解决方案来解决需要通过引用进行比较的问题:
===
通过引用执行直接比较。