Есть ли такая функция, как is_reference_of в php? - PullRequest
1 голос
/ 09 апреля 2011

Я бы хотел узнать у моей программы, на какую переменную ссылается переменная. Есть ли способ сделать это? Я просмотрел все обычные источники и ничего не смог найти, возможно, мои поисковые термины были глупыми Спасибо.

Ответы [ 4 ]

3 голосов
/ 09 апреля 2011

Вы можете просто сравнить ссылки с оператором ===

Примечание: здесь сравниваются только ссылки на объекты.

$obj1 = new DateTime();
$obj2 = $obj1;

if($obj2 === $obj1){
    echo "Equal";
}else {
    echo "Not Equal";
}
// Outputs Equal


$obj2 = new DateTime();

if($obj2 === $obj1){
   echo "Equal";
}else {
   echo "Not Equal";
}
// Outputs Not Equal
0 голосов
/ 09 апреля 2011

Насколько я знаю, нет прямого способа проверить, указывают ли две переменные на одно и то же.Нечто подобное может сработать:

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

Огромный отказ от ответственности: я не очень тщательно продумал это.Могут быть всевозможные побочные эффекты при выполнении чего-то подобного описанному выше.Считайте, что это просто подтверждение концепции, с которой можно начать

Если вы всегда работаете с массивами или классами , вы можете попробовать установить временное поле или свойство в одном и посмотреть, существует ли онодругое и т. д. Это будет менее подвержено ошибкам, чем приведенный выше код, который изменяет всю переменную.

Обратите внимание, что порядок параметров в вышеуказанной функции не имеет значения.

Обновление: С объектами вы можете использовать === и вообще пропустить функцию.Я немного обновил функцию, чтобы определить тип проверяемой переменной и соответственно реагировать.Отказ от ответственности по-прежнему применяется.

0 голосов
/ 09 апреля 2011

Если вы имеете дело с объектами, я считаю, === выполняет тест, который вы хотите.

$obj1 = new Object;
$obj2 = $obj1;

echo ($obj1 === $obj2) ? 'same' : 'not same'; // same

$obj2 = new Object;

echo ($obj1 === $obj2) ? 'same' : 'not same'; // not same
0 голосов
/ 09 апреля 2011

Единственный код, который я лично знаю, - это прямой запрос, а не его получение:

if($var instanceof Your_Class) { }

Если вы знаете, что переменная является строго классом, вы можете использовать:

get_class();

Если вы используете функцию для необъекта, она возвращает E_WARNING. Я бы предложил такой код:

$class_known = false;
if(is_object($class))
{
    $class_name = get_class($class);
    $class_known = false;
}

if($class_known)
{
    echo $class_name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...