Как увидеть адрес памяти объекта в Xdebug / PHPStorm

1023
PartySoft

Есть ли способ увидеть выделенный адрес памяти переменной, объекта при отладке с помощью Xdebug и PHPStorm?

Не знаю, является ли это параметром в Xdebug или PHPstorm, но я уверен, что это возможно. Теперь он просто показывает значение, а не адрес.

Моя цель - увидеть, действительно ли я использую тот же экземпляр объекта в каком-то другом классе

0

2 ответа на вопрос

1
Oberst

Im sure you already figured this out by now, but incase you havent (and for the sake of providing a lonely question with an answer)

(this assumes you already have xdebug working with PHPStorm, and are able to debug through PHPStorm)
In the current version of PHPStorm (10.0 as of the time of this writting), in the debug window, there is a yellow circle with an "@" in it. Clicking that will show you the memory addresses.

In my examples below, notice my $ds object. It just lists the class (DBConnection). After turning on the addresses, you can see them. (DBConnection@69796600)

This button enter image description here

1
Zef

Не делай ту же ошибку, что и я. Адрес объекта может отличаться, в то время как объект одинаков (т.е. spl_object_hash возвращает одинаковый идентификатор для обоих объектов).

Например, я написал этот тест:

$a = $b = new StdClass; $objects = [$a, $b];  var_dump(spl_object_hash($a), spl_object_hash($b));  foreach ($objects as $object1);  var_dump(spl_object_hash($a), spl_object_hash($b));  foreach ($objects as &$object2);  var_dump(spl_object_hash($a), spl_object_hash($b)); 

Как и ожидалось, идентификатор, возвращаемый функцией spl_object_hash (), совпадает с $ a, $ b и объектами в $ objects. Но адрес объектов в $ objects не совпадает с адресом $ a и $ b:

string(32) "000000007fbf1856000000002722d91d" string(32) "000000007fbf1856000000002722d91d" string(32) "000000007fbf1856000000002722d91d" string(32) "000000007fbf1856000000002722d91d" string(32) "000000007fbf1856000000002722d91d" string(32) "000000007fbf1856000000002722d91d" 

enter image description here

Ну, конечно, ваш пример изменил адрес памяти. Доступ к объекту по ссылке заставляет указатель использовать адрес новой переменной. Вы можете увидеть это в действии с помощью другого простого теста (разделить каждый на новые строки ... Комментарии глупы). `$ a = новый StdClass; $ b = $ a; $ c = $ b; echo ''; $ d = & $ a; echo ''; $ e = & $ b; echo '';` Добавить точку останова в каждый `эхо`, и вы можете наблюдать за изменениями адресов между каждым назначением. Я рекомендую вам хороший комментарий по указателям и ссылкам на сайте PHP (в частности, по третьему принципу): http://php.net/manual/en/language.oop5.references.php#101900 Oberst 8 лет назад 0