Php 为什么这个引用平等性会被打破?

Php 为什么这个引用平等性会被打破?,php,Php,我有下面的PHP代码,充满了测试,以查看程序在哪里崩溃。其意图是$P1是对玩家的第一个元素的引用,然后$P1G是对$P1中某个元素的成员的引用。由于我不明白的原因,该程序在“a2a”时终止。据我所知,将值赋给成员的引用不应导致引用不再相等 $Players是一个数组,$P1是一个assoc数组。(全部由PDO::fetchAll生成并进一步开发信息),以及$P1=$Players[0] 据我所知,$A==$B意味着A和B变量都指向同一个对象,因此如果我赋值给B,则===将变为false,但如果我

我有下面的PHP代码,充满了测试,以查看程序在哪里崩溃。其意图是$P1是对玩家的第一个元素的引用,然后$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';
根据评论:

在其他语言中,数组相等性通常通过比较数组的内存地址来确定,即
array1==array2
array1==array2
仅在两个数组是内存中同一数组的同一实例时才计算为
true
。创建阵列的相同克隆并将克隆与原始克隆进行比较,即使元素相同,也会导致计算结果为
false

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

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

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

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

  • 您可以将单个数组元素包装到对象中,这将允许
    ==
    通过引用执行直接比较
  • 您可以向每个数组元素添加唯一的ID值,并比较这些ID,而不是整个数组
  • 根据评论:

    在其他语言中,数组相等性通常通过比较数组的内存地址来确定,即
    array1==array2
    array1==array2
    仅在两个数组是内存中同一数组的同一实例时才计算为
    true
    。创建阵列的相同克隆并将克隆与原始克隆进行比较,即使元素相同,也会导致计算结果为
    false

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

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

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

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

  • 您可以将单个数组元素包装到对象中,这将允许
    ==
    通过引用执行直接比较
  • 您可以向每个数组元素添加唯一的ID值,并比较这些ID,而不是整个数组

  • 乍一看,不要阅读问题:PHP中的引用非常接近于编码的味道。您可能需要重构代码。@AlanBaljeu请将您的问题包括在内,每个人都可以运行该问题,以确保它在“a2a”上终止。您正在修改引用
    $P1[“games”]
    中某个元素的
    $P1G
    。这使得
    $P1
    不再等于
    $Players[0]
    。无论您在尝试什么,这段代码都非常复杂且难以理解。无论它试图做什么,都可能以不同的方式完成。我已经用PHP编写代码超过15年了,一方面我可能会数出除了使用引用之外别无选择的次数。在执行
    ==
    相等性检查时,PHP中的数组不会按引用进行比较。PHP中的
    ==
    相等检查将检查两个值是否具有相同的值和类型(特别是此运算符确保严格的类型检查)。特别是,PHP的数组并不像许多其他语言那样通过内存地址进行比较,而是通过它们的内容进行比较。对象是一个完全不同的问题,
    =
    将比较类、属性和值以确定相等性,而
    ==