对于表示数组或对象的两个变量,有没有办法检查 identity (即完全相同的对象,占用内存中的一个且只占一个位置)? (即,当一个修改由一个变量命名的对象时,可以在另一个变量的值中看到更改,因为它们指向同一个对象/数组)
例如,===
运算符检查两个数组是否“相同”,因为它们的元素及其排序相等(而不是==
,而不检查数组的排序,对于$a = [11, 22]; $b = [1 => 22; 0 => 11];
,$a == $b
为true
,$a === $b
为false
(因为在后一种情况下,排序不同,数组是有序映射)。
我想象的are_identical
函数会像这样工作(有点像Python中的is
):
$a = [11, 22];
$b = [11, 22];
are_identical($a, $b); # => false
$x = [11, 22];
$y = &$x;
are_identical($x, $y); # => true
答案 0 :(得分:3)
你不能用PHP中的数组做到这一点;但是,您可以更改代码以使用ArrayObject
并使用===
运算符进行比较。
在PHP中,如果对象是同一个类的相同实例(即它们引用内存中的同一个对象),===
运算符将仅返回true。
答案 1 :(得分:1)
可以通过使用三等号来测试PHP中的对象以查看它们是否是同一个实例:
if($obj1 === $obj2) {....}
但是,数组不是PHP中的对象,因此三重相等的技巧不会像对象那样对它们起作用。
也就是说,这个php手册页也可以提供帮助:Spotting References。评论中有几个功能声称能够检测到彼此引用的变量。
答案 2 :(得分: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;
}
}