Php 为什么这个引用平等性会被打破?
我有下面的PHP代码,充满了测试,以查看程序在哪里崩溃。其意图是$P1是对玩家的第一个元素的引用,然后$P1G是对$P1中某个元素的成员的引用。由于我不明白的原因,该程序在“a2a”时终止。据我所知,将值赋给成员的引用不应导致引用不再相等 $Players是一个数组,$P1是一个assoc数组。(全部由PDO::fetchAll生成并进一步开发信息),以及$P1=$Players[0] 据我所知,$A==$B意味着A和B变量都指向同一个对象,因此如果我赋值给B,则===将变为false,但如果我赋值给$B中的某个对象,则它们应该仍然指向同一个对象,并且对象被修改。和大多数现代语言一样 但是,“a2a”表示我误解了什么。我哪里出错了Php 为什么这个引用平等性会被打破?,php,Php,我有下面的PHP代码,充满了测试,以查看程序在哪里崩溃。其意图是$P1是对玩家的第一个元素的引用,然后$P1G是对$P1中某个元素的成员的引用。由于我不明白的原因,该程序在“a2a”时终止。据我所知,将值赋给成员的引用不应导致引用不再相等 $Players是一个数组,$P1是一个assoc数组。(全部由PDO::fetchAll生成并进一步开发信息),以及$P1=$Players[0] 据我所知,$A==$B意味着A和B变量都指向同一个对象,因此如果我赋值给B,则===将变为false,但如果我
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';
根据评论:
在其他语言中,数组相等性通常通过比较数组的内存地址来确定,即array1==array2
和array1==array2
仅在两个数组是内存中同一数组的同一实例时才计算为true
。创建阵列的相同克隆并将克隆与原始克隆进行比较,即使元素相同,也会导致计算结果为false
在PHP中,数组的比较方式与许多其他编程语言不同。PHP不是检查两个数组是否是同一个实例,而是直接比较数组的内容。也就是说,两个相同的数组,即使它们是不同的实例,也将导致array1==array2
和array1===array2
计算为true
换句话说,PHP中的数组是按值比较的,而不是按引用比较的。事实上,默认情况下,PHP也不会执行数组的引用赋值,而是创建给定数组的副本
PHP中的对象是另一回事。当使用==
时,PHP将检查类、属性和属性值是否完全相同。当使用==
时,PHP将检查对象的实例是否相同。换句话说,对象可以选择通过值或引用执行比较
考虑到所有这些,您可以使用两种解决方案来解决需要通过引用进行比较的问题:
==
通过引用执行直接比较李>
array1==array2
和array1==array2
仅在两个数组是内存中同一数组的同一实例时才计算为true
。创建阵列的相同克隆并将克隆与原始克隆进行比较,即使元素相同,也会导致计算结果为false
在PHP中,数组的比较方式与许多其他编程语言不同。PHP不是检查两个数组是否是同一个实例,而是直接比较数组的内容。也就是说,两个相同的数组,即使它们是不同的实例,也将导致array1==array2
和array1===array2
计算为true
换句话说,PHP中的数组是按值比较的,而不是按引用比较的。事实上,默认情况下,PHP也不会执行数组的引用赋值,而是创建给定数组的副本
PHP中的对象是另一回事。当使用==
时,PHP将检查类、属性和属性值是否完全相同。当使用==
时,PHP将检查对象的实例是否相同。换句话说,对象可以选择通过值或引用执行比较
考虑到所有这些,您可以使用两种解决方案来解决需要通过引用进行比较的问题:
==
通过引用执行直接比较李>
乍一看,不要阅读问题:PHP中的引用非常接近于编码的味道。您可能需要重构代码。@AlanBaljeu请将您的问题包括在内,每个人都可以运行该问题,以确保它在“a2a”上终止。您正在修改引用
$P1[“games”]
中某个元素的$P1G
。这使得$P1
不再等于$Players[0]
。无论您在尝试什么,这段代码都非常复杂且难以理解。无论它试图做什么,都可能以不同的方式完成。我已经用PHP编写代码超过15年了,一方面我可能会数出除了使用引用之外别无选择的次数。在执行==
相等性检查时,PHP中的数组不会按引用进行比较。PHP中的==
相等检查将检查两个值是否具有相同的值和类型(特别是此运算符确保严格的类型检查)。特别是,PHP的数组并不像许多其他语言那样通过内存地址进行比较,而是通过它们的内容进行比较。对象是一个完全不同的问题,=
将比较类、属性和值以确定相等性,而==