Подтвердить что ты не робот

Как проверить расположение памяти переменной в php?

Как проверить расположение памяти переменной в php?

Спасибо

4b9b3361

Ответ 1

Если вам нужно знать, является ли $varA ссылкой на $varB, то вам не повезло: PHP innards не предоставляет эту информацию разработчику.

Однако вы можете извлечь некоторую информацию о ссылках, анализируя выходные данные из var_dump или debug_zval_dump(). Прочитайте соответствующие разделы руководства и ознакомьтесь с этим вопросом для получения дополнительной информации.

И подготовьте эту (PDF) статью Дерика Ретанса о ссылках на PHP.

Следите за refcount при использовании debug_zval_dump(), потому что функция всегда создает дополнительную ссылку внутри себя, увеличивает значение на 1

Ответ 2

Если вам нужно знать, является ли переменная ссылкой на другую, то debug_zval_dump() является единственным вариантом.

Ответ 3

Извините, но это невозможно [1]

Они не похожи на C-указатели; для экземпляр, вы не можете выполнить указатель арифметика с их использованием

[1] http://php.net/manual/en/language.references.php

Ответ 4

Чтобы проверить, является ли одна переменная ссылкой на другую, вы можете сделать следующее:

function is_ref_to(&$a, &$b)
{
    $t = $a;
    if($r=($b===($a=1))){ $r = ($b===($a=0)); }
    $a = $t;
    return $r;
}

Ответ 5

Я уверен, что это невозможно в PHP. Возможно, вы сможете создать расширение для этого, но я не могу его использовать. Адреса памяти бесполезны в PHP-скриптах, поскольку интерпретатор обрабатывает всю внутреннюю переменную. Вне PHP (скажем, манипулирование адресом памяти с C или С++) было бы опасно, если не сказать больше. Я ожидаю, что вы могли бы сбой script и, возможно, ваш интерпретатор, если вы изменили адрес памяти, используемый PHP скрипт во время его выполнения.
Однако если вы ищете внутренние указатели в PHP, посмотрите references. Может потребоваться несколько чтений, чтобы обернуть вокруг вас голову, но если вам нужно пройти по ссылке, просмотрите их. Быстрый пример:

<?php
function change( &$name ) { $name = "Yosef" }
$name = "John";
change( $name );
echo $name;
?>

Ответ 6

Как говорили другие, API не предоставляет способ получить адрес значения. Однако вы можете сравнить адреса двух значений, учитывая две переменные. Здесь функция, которая проверяет, ссылаются ли две переменные на одно значение:

function vars_reference_same_value(&$a, &$b)
{
  $not_b = $b === 0 ? 1 : 0;
  $a_orig = $a;
  $a = $not_b;
  $is_ref = $b === $not_b;
  $a = $a_orig;
  return $is_ref;
}

(Это то же самое, что ответ @infinity, но, возможно, более понятный.)