 | |
04.12.2006, 14:50
| Nach oben
#1 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| An interne ID eines Objektes rankommen
Hi.
Wenn cih ein Objekt "dumpe", dann sehe ich dort immer quasi die interne ID des Objektes: Gibt es eine Möglickeit an diesen Wert ranzukommen (außer via preg_mach(var_export()))?
Basti
|
| |
04.12.2006, 15:09
| Nach oben
#2 | | Martin Breuer
Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Ich hab jetzt gesucht aber gefunden hab ich nichts. Bin auf ne Lösung auch gespannt.
|
| |
04.12.2006, 15:14
| Nach oben
#3 | | Benjamin Steininger
Registriert seit: 02.06.2005 Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
|
leider ohne helfen zu können würde mich interessieren was man damit anfangen kann.
|
| |
04.12.2006, 15:33
| Nach oben
#4 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Mir ist bei einem Update xdebug abhanden gekommen und ich konnte noch keine Lösung dafür finden. Jetzt hab ich mich gerade an eine lesbare Exception-Ausgabe gekümmert und da wäre dieser Wert net schlecht.
Im Moment (sehr wüst und mit dem Workaround via var_dump) sieht das so aus: PHP-Code: try { $Cms = new FrontController(); $Cms->run();
} catch (Exception_BaseException $e) {
$sAbspath = realpath(dirname(__FILE__));
echo <<<EOT <style> .exception { background-color: #fff; font-family: mono; font-size: 11px; }
.exception a { color: #00f; }
.exception td { vertical-align: top; padding: 5px; background-color: #77f; font-size: 11px; } </style> EOT;
print '<div class="exception">'; print "<h1>".get_class($e)."</h1>\n"; print "<h2>{$e->getMessage()} ({$e->getCode()})</h2>\n\n"; print str_replace($sAbspath, '', $e->getFile()); print '(' . $e->getLine() . ")<br /><br />\n";
$aTrace = $e->getTrace(); $iNum = count($aTrace); $aObjects = array(); $aArrays = array();
echo '<table>';
foreach ($aTrace as $i => $aTracePart) {
$sFile = str_replace($sAbspath, '', $aTracePart['file']); echo '<tr>'; echo '<td>', $iNum - $i, '</td>'; echo '<td>'; if (isset($aTracePart['class'])) echo $aTracePart['class'], '::';
echo $aTracePart['function'], '<ul>'; foreach ($aTracePart['args'] as $mArg) {
echo '<li>('; echo gettype($mArg); echo ') '; switch (gettype($mArg)) {
case 'object': ob_start(); var_dump($mArg); $s = ob_get_contents(); preg_match('|^object\([a-zA-Z0-9_\-]*\)#([0-9]*)|', $s, $aParts); ob_end_clean(); $iId = (int) $aParts[1];
$aObjects[$iId] = $mArg; echo '<a href="#object_' . $iId . '">'; echo get_class($mArg); echo ' #', $iId; echo '</a>'; break;
case 'array': $aArrays[] = $mArg; $iId = count($aArrays) - 1; echo '<a href="#array_' . $iId . '">'; echo get_class($mArg); echo '</a>'; break;
case 'string': $mArg = str_replace($sAbspath, '', $mArg); if (strlen($mArg) > 20) { $mArg = substr($mArg, 0, 5) . ' … ' . substr($mArg, -10); } echo $mArg; break;
default: echo $mArg; } echo '</li>'; } echo '</td>'; echo '<td>', $sFile, ' (', $aTracePart['line'], ')</td>'; echo "</tr>"; } echo "</table></div>";
foreach ($aObjects as $iId => $Obj) { echo '<hr/><a name="object_' . $iId . '"><pre>'; var_dump($Obj); echo '</pre>'; } foreach ($aArrays as $iId => $aArray) { echo '<hr/><a name="array_' . $iId . '"><pre>'; var_dump($aArray); echo '</pre>'; } die; }
Die Objekte, die als Parameter übergeben werden, werden nicht direkt ausgegeben, sondern unter der eigentlichen Tabelle ausgespuckt und entsprechend verlinkt.
Basti
|
| |
04.12.2006, 17:56
| Nach oben
#5 | | Lutz
Registriert seit: 14.08.2005 Ort: Nienburg / Weser
Beiträge: 684
|
Also wenn ich nen Dump (var_dump) auf eine Klasse mache, gibt mir die Zahl in Klammern dahinter nur die Anzahl der Elemente im Objekt wieder!? Oder ist das eine Neuerung in PHP5?
__________________ Paradox ist, wenn jemand für seinen Alkoholkonsum geradestehen soll |
| |
04.12.2006, 20:41
| Nach oben
#6 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Zitat von MrNiceGuy Oder ist das eine Neuerung in PHP5? | Keine Ahnung, ob das neu ist. PHP-Code: class A { protected $foo; }
$A = new A; $B = new A; $C = $A;
var_dump($A); var_dump($B); var_dump($C);
Code: object(A)#1 (1) {
["foo:protected"]=>
NULL
}
object(A)#2 (1) {
["foo:protected"]=>
NULL
}
object(A)#1 (1) {
["foo:protected"]=>
NULL
}
Zum Thema:
Die Reflection-API scheint es auch nicht herzugeben.
Basti
Geändert von Basti (04.12.2006 um 20:50 Uhr).
|
| |
26.02.2007, 12:01
| Nach oben
#7 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Muss das hier gerade nochmal rauskramen.
Hast du eine "direktere" Lösung gefunden?
|
| |
26.02.2007, 14:36
| Nach oben
#8 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Nein.
|
| |
07.03.2007, 18:37
| Nach oben
#9 | | Benutzer
Registriert seit: 02.09.2005
Beiträge: 68
|
Könnts sein das du
print_r( $class, true ); suchst?
|
| |
08.03.2007, 05:54
| Nach oben
#10 | | Neuer Benutzer
Registriert seit: 31.05.2006
Beiträge: 24
|
Was bringt dir die Nummer? Das is eine laufende Nummer, an welcher Stelle das Objekt generiert wurde. Im Regelfall variert sie aber zu stark, als das man sinnvolle Schlüsse daraus ziehen kann ^^
|
| |
08.03.2007, 07:45
| Nach oben
#11 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Ich persönlich brauchte das für das Debugging. Mein Problem hat sich aber erledigt. |
| |
08.03.2007, 11:02
| Nach oben
#12 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Zitat von KingCrunch Was bringt dir die Nummer? Das is eine laufende Nummer, an welcher Stelle das Objekt generiert wurde. Im Regelfall variert sie aber zu stark, als das man sinnvolle Schlüsse daraus ziehen kann ^^ | Mir ging es auch um eine Debug-Anzeige. Es ist einfach nervig, wenn ein Objekt 20mal komplett aufgelistet wird, anstatt nur einmal je Instanz.
Basti
|
| |
17.03.2007, 21:36
| Nach oben
#14 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Dann scheints also doch sowas zu geben. Oder was meint "same object"? Meint es, dass zwei Objekte identisch sind (also quasi nur eine Prüfsumme gebildet wird) oder meint es tatsächlich Referenzen?
Hab hier auf dem Mac noch keine MAMP-Umgebung installiert, drum kann ichs grad nicht testen. Der Test sähe aber etwa so aus: PHP-Code: <?php
class Foo {}
$A = new Foo; $B = $A; $C = new Foo;
print (spl_object_hash($A) === spl_object_hash($B)) ? "okay\n" : "nok\n";
print (spl_object_hash($A) !== spl_object_hash($C)) ? "okay\n" : "nok\n"; Basti
|
| |
17.03.2007, 21:57
| Nach oben
#15 | | Christian Schuhmann
Registriert seit: 09.03.2007 Ort: Nürnberg
Beiträge: 58
|
Hi Basti, PHP-Code: <?php
class Foo {}
$A = new Foo; $B = $A; $C = new Foo;
print (spl_object_hash($A) === spl_object_hash($B)) ? "A == B\n" : "A != B\n";
print (spl_object_hash($A) !== spl_object_hash($C)) ? "A != C\n" : "A == C\n"; ?> Ergibt: bobby.
|
| |
18.03.2007, 23:07
| Nach oben
#16 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Na, dann passts doch. Vielen dank.
Basti
|
| |
19.03.2007, 17:12
| Nach oben
#17 | | Benjamin Klaile
Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Bedanke mich auch.
|
| |
29.03.2007, 14:37
| Nach oben
#18 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Hab hier[1] (übrigens ein sehr schönes Tutorial!) gerade folgendes gelesen: Zitat: |
Objects quoted in string context resolve to a unique identifier (even if __toString() is defined).
| [1] http://devzone.zend.com/node/view/id/6
Bei folgendem Test erhalte ich (5.2.0) jedoch einen fatal error: PHP-Code: <?php
class A { protected $foo; }
$A = new A; $B = new A; $C = $A;
echo "$A\n"; echo "$B\n"; echo "$C\n"; Weiß wer von euch was darüber?
Basti
|
| |
29.03.2007, 14:52
| Nach oben
#19 | | Verplanter Benutzer
Registriert seit: 14.12.2004
Beiträge: 227
|
"Catchable fatal error: Object of class A could not be converted to string "...
Mit ... gehts.
Ausgabe: PHP-Code: A Object ( [foo:protected] => )
__________________
Das Leben ist zwar bloß ein Adventure-Game, aber die Grafik ist verdammt gut.
Ich such immer noch den Cheat für unlimited money!
Geändert von DasMööp (29.03.2007 um 14:55 Uhr).
|
| |
29.03.2007, 14:55
| Nach oben
#20 | | Bastian Fenske
Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Zitat von DasMööp | Was verstehst du unter "gehts" bzw. was hat das mit der Anforderung zu tun? Zitat: |
Objects quoted in string context resolve to a unique identifier (even if __toString() is defined).
| Basti
|
| | |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | | |
Forumregeln
| Es ist dir nicht erlaubt, neue Themen zu verfassen. Es ist dir nicht erlaubt, auf Beiträge zu antworten. Es ist dir nicht erlaubt, Anhänge hochzuladen. Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten. HTML-Code ist aus. | | |
Ähnliche Themen | | Thema | Autor | Forum | Antworten | Letzter Beitrag | | Interne Klassen zuweisung | Berti | PHP-Programmierung | 5 | 03.04.2007 12:14 | Alle Zeitangaben in WEZ +2. Es ist jetzt 07:46 Uhr.
|