Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > An interne ID eines Objektes rankommen
Antwort
 
Themen-Optionen
Alt 04.12.2006, 14:50   Nach oben    #1
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 750
Standard An interne ID eines Objektes rankommen

Hi.

Wenn cih ein Objekt "dumpe", dann sehe ich dort immer quasi die interne ID des Objektes:

Code:
object(Page)#26
Gibt es eine Möglickeit an diesen Wert ranzukommen (außer via preg_mach(var_export()))?

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.12.2006, 15:09   Nach oben    #2
WarrenFaith
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.793
Standard

Ich hab jetzt gesucht aber gefunden hab ich nichts. Bin auf ne Lösung auch gespannt.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.12.2006, 15:14   Nach oben    #3
robo47
BIN EIN KRASSA HELD!!!111
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.188
Standard

leider ohne helfen zu können würde mich interessieren was man damit anfangen kann.
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.12.2006, 15:33   Nach oben    #4
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 750
Standard

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($mArg05) . ' &hellip; ' 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
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.12.2006, 17:56   Nach oben    #5
MrNiceGuy
Erfahrener Benutzer
 
Benutzerbild von MrNiceGuy
 
Registriert seit: 14.08.2005
Ort: Nienburg / Weser
Beiträge: 609
Standard

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
MrNiceGuy ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 04.12.2006, 20:41   Nach oben    #6
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 750
Standard

Zitat:
Zitat von MrNiceGuy Beitrag anzeigen
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).
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.02.2007, 12:01   Nach oben    #7
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
Standard

Muss das hier gerade nochmal rauskramen.
Hast du eine "direktere" Lösung gefunden?
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.02.2007, 14:36   Nach oben    #8
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 750
Standard

Nein.
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 07.03.2007, 18:37   Nach oben    #9
Julied64
Benutzer
 
Registriert seit: 02.09.2005
Beiträge: 68
Standard

Könnts sein das du

print_r( $class, true ); suchst?
Julied64 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2007, 05:54   Nach oben    #10
KingCrunch
Neuer Benutzer
 
Registriert seit: 31.05.2006
Beiträge: 24
Standard

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 ^^
KingCrunch ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2007, 07:45   Nach oben    #11
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
Standard

Ich persönlich brauchte das für das Debugging. Mein Problem hat sich aber erledigt.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2007, 11:02   Nach oben    #12
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 750
Standard

Zitat:
Zitat von KingCrunch Beitrag anzeigen
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
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.03.2007, 17:10   Nach oben    #13
bobby
Benutzer
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 53
Standard

Wenn ich dich jetzt richtig verstanden haben, willst du eine eindeutige Objectid (-hash). Vielleicht kann dir http://de.php.net/manual/de/function...bject-hash.php weiterhelfen.

bobby
bobby ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.03.2007, 21:36   Nach oben    #14
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 750
Standard

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
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.03.2007, 21:57   Nach oben    #15
bobby
Benutzer
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 53
Standard

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:
PHP-Code:
== B
!= 
bobby.
bobby ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.03.2007, 23:07   Nach oben    #16
Basti
Erfahrener Benutzer
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 750
Standard