Насколько я знаю, нет прямого способа проверить, указывают ли две переменные на одно и то же.Нечто подобное может сработать:
function is_reference_of(&$a, &$b)
{
// if an object, use strict comparison
if (is_object($a)) return $a === $b;
// definitely not a reference to each other if they aren't the same value
if ($a !== $b) return false;
$tmp = $a;
if (is_array($a))
{
$a = 0;
// if $b is no longer an array, then it must be a reference to $a
$is_ref = !is_array($b);
}
else
{
$a = !$a;
// if $b is no longer equal to $tmp, then it must be a reference to $a
$is_ref = ($b !== $tmp);
}
// make sure to reset $a back to what it was
$a = $tmp;
return $is_ref;
}
$a = 0;
$b = 0;
is_reference_of($a, $b); // false
$b = &$a;
is_reference_of($a, $b); // true
Огромный отказ от ответственности: я не очень тщательно продумал это.Могут быть всевозможные побочные эффекты при выполнении чего-то подобного описанному выше.Считайте, что это просто подтверждение концепции, с которой можно начать
Если вы всегда работаете с массивами или классами , вы можете попробовать установить временное поле или свойство в одном и посмотреть, существует ли онодругое и т. д. Это будет менее подвержено ошибкам, чем приведенный выше код, который изменяет всю переменную.
Обратите внимание, что порядок параметров в вышеуказанной функции не имеет значения.
Обновление: С объектами вы можете использовать ===
и вообще пропустить функцию.Я немного обновил функцию, чтобы определить тип проверяемой переменной и соответственно реагировать.Отказ от ответственности по-прежнему применяется.