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

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

благодаря

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

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

И подготовьте эту статью (PDF) от Derick Rethans по ссылкам в PHP.

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

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

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

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

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

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

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

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

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

Как говорили другие, 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; } 

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