嗨,
如果您想检查两个变量是否相互引用(即指向相同的内存),您可以使用以下函数
<?php
function same_type(&$var1, &$var2){
return gettype($var1) === gettype($var2);
}
function is_ref(&$var1, &$var2) {
if(!same_type($var1, $var2)) {
return false;
}
$same = false;
if(is_array($var1)) {
do {
$key = uniqid("is_ref_", true);
} while(array_key_exists($key, $var1));
if(array_key_exists($key, $var2)) {
return false;
}
$data = uniqid("is_ref_data_", true);
$var1[$key] =& $data;
if(array_key_exists($key, $var2)) {
if($var2[$key] === $data) {
$same = true;
}
}
unset($var1[$key]);
} elseif(is_object($var1)) {
if(get_class($var1) !== get_class($var2)) {
return false;
}
$obj1 = array_keys(get_object_vars($var1));
$obj2 = array_keys(get_object_vars($var2));
do {
$key = uniqid("is_ref_", true);
} while(in_array($key, $obj1));
if(in_array($key, $obj2)) {
return false;
}
$data = uniqid("is_ref_data_", true);
$var1->$key =& $data;
if(isset($var2->$key)) {
if($var2[$key] === $data) {
$same = true;
}
}
unset($var1->$key);
} elseif (is_resource($var1)) {
if(get_resource_type($var1) !== get_resource_type($var2)) {
return false;
}
return ((string) $var1) === ((string) $var2);
} else {
if($var1!==$var2) {
return false;
}
do {
$key = uniqid("is_ref_", true);
} while($key === $var1);
$tmp = $var1; $var1 = $key; $same = $var1 === $var2; $var1 = $tmp; }
return $same;
}
?>
尽管此实现相当完整,但它无法处理函数引用和其他一些小问题。
此函数在您想手动序列化递归数组时特别有用。
用法类似于
<?php
$a = 5;
$b = 5;
var_dump(is_ref($a, $b)); $a = 5;
$b = $a;
var_dump(is_ref($a, $b)); $a = 5;
$b =& $a;
var_dump(is_ref($a, $b)); echo "---\n";
$a = array();
var_dump(is_ref($a, $a)); $a[] =& $a;
var_dump(is_ref($a, $a[0])); echo "---\n";
$b = array(array());
var_dump(is_ref($b, $b)); var_dump(is_ref($b, $b[0])); echo "---\n";
$b = array();
$b[] = $b;
var_dump(is_ref($b, $b)); var_dump(is_ref($b, $b[0])); var_dump(is_ref($b[0], $b[0][0])); echo "---\n";
var_dump($a);
var_dump($b);
?>
* 请注意 PHP 的内部行为,它似乎在实际复制变量之前就进行了引用赋值!因此,对于最后一个测试用例,您会得到一个包含(不同的)递归数组的数组,而不是您可能期望的包含空数组的数组。
BenBE。