Wie wird die Speicheradresse eines Objekts in Xdebug / PHPStorm angezeigt?

1146
PartySoft

Gibt es eine Möglichkeit, die zugewiesene Speicheradresse einer Variablen oder eines Objekts beim Debuggen mit Xdebug und PHPStorm anzuzeigen?

Ich weiß nicht, ob dies eine Einstellung in Xdebug oder PHPstorm ist, aber ich bin sicher, dass dies möglich ist. Jetzt wird nur der Wert und nicht die Adresse angezeigt.

Mein Ziel ist es zu sehen, ob ich tatsächlich dieselbe Instanz eines Objekts in einer anderen Klasse verwende

0

2 Antworten auf die Frage

1
Oberst

Ich bin mir sicher, dass Sie das bereits herausgefunden haben, aber Sie müssen nicht (und um eine einsame Frage mit einer Antwort zu beantworten)

(Dies setzt voraus, dass Sie bereits xdebug mit PHPStorm arbeiten und über PHPStorm debuggen können.)
In der aktuellen Version von PHPStorm (10.0 zum Zeitpunkt dieses Schreibens) befindet sich im Debug-Fenster ein gelber Kreis mit einem "@ " drin. Wenn Sie darauf klicken, werden Ihnen die Speicheradressen angezeigt.

Beachten Sie in meinen folgenden Beispielen mein $dsObjekt. Es listet nur die Klasse ( DBConnection) auf. Nach dem Einschalten der Adressen können Sie sie sehen. ( DBConnection@69796600)

Diese Schaltfläche

1
Zef

Machen Sie nicht den gleichen Fehler wie ich. Die Adresse des Objekts kann unterschiedlich sein, solange das Objekt dieselbe ist (dh spl_object_hash gibt für beide Objekte dieselbe ID zurück).

Zum Beispiel habe ich diesen Test geschrieben:

$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)); 

Wie erwartet ist die von spl_object_hash () zurückgegebene ID identisch mit $ a, $ b und den Objekten in $ objects. Die Adresse der Objekte in $ objects stimmt jedoch nicht mit $ a und $ b überein:

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

Natürlich hat Ihr Beispiel die Speicheradresse geändert. Durch den Zugriff auf ein Objekt über einen Verweis wird die Adresse der neuen Variablen vom Zeiger verwendet. Sie können dies durch einen weiteren einfachen Test in Aktion sehen (trennen Sie sich auf neue Zeilen ... Kommentare sind dumm). $ a = neue StdClass; $ b = $ a; $ c = $ b; echo ''; $ d = & $ a; echo ''; $ e = & $ b; echo ''; `Fügen Sie einen Haltepunkt hinzu Mit jedem "Echo" können Sie beobachten, wie sich die Adressen zwischen den Zuordnungen ändern. Ich beziehe mich auf einen netten Kommentar zu Zeigern und Verweisen auf der PHP-Site (insbesondere das 3. Prinzip): http://php.net/manual/de/language.oop5.references.php#101900 Oberst vor 8 Jahren 0