2

有没有办法检查表示数组或对象的两个变量的身份(即完全相同的对象,在内存中只占一个位置)?(即,当修改由一个变量命名的对象时,可以在另一个变量的值中看到更改,因为它们指向同一个对象/数组)

例如,===运算符检查两个数组是否“相同”,因为它们的元素和它们的顺序相等(相反==,它不检查数组的顺序,所以 for $a = [11, 22]; $b = [1 => 22; 0 => 11];, $a == $bis truebut $a === $bis false(因为在后一种情况下排序不同,数组是有序映射)。

我想象的are_identical函数会像这样工作(有点像isPython 中的):

$a = [11, 22];
$b = [11, 22];
are_identical($a, $b); # => false

$x = [11, 22];
$y = &$x;
are_identical($x, $y); # => true
4

3 回答 3

3

你不能用 PHP 中的数组来做到这一点;但是,您可以更改要使用的代码ArrayObject并使用运算符进行比较===

在 PHP 中,===只有当对象是同一个类的同一个实例(即它们引用内存中的同一个对象)时,运算符才会返回 true。

于 2013-01-09T13:48:55.460 回答
1

PHP 中的对象可以通过使用三等号来测试它们是否是同一个实例:

if($obj1 === $obj2) {....}

但是,数组不是 PHP 中的对象,因此三等号技巧对它们的作用与对对象的作用不同。

也就是说,这个 php 手册页也可能会有所帮助:Spotting References。注释中有几个函数声称能够检测到相互引用的变量。

于 2013-01-09T14:03:55.520 回答
0

好的,谢谢 Artem L 和 SDC:是的,其他人也问过这个问题,但形式不同,所以我不知道要找什么。

这段代码似乎满足了我的are_identical功能的目的(否定):

function is_reference_to(&$a, &$b)
{
    if ($a !== $b) return false;

    $temp = $a;
    $checkval = $a === null ? "" : null;
    $a = $checkval;

    if ($b === $checkval) {
        $a = $temp;
        return true;
    } else {
        $a = $temp;
        return false;
    }        
}
于 2013-01-10T16:14:37.153 回答