PHP bietet zwei simple Möglichkeiten um anonyme Objekte zu erzeugen. Diese sind immer dann sinnvoll nutzbar, wenn eine Funktion einen komplexen Wert zurückgibt, man aber nicht mit einem assoziativen Array arbeiten möchte.
Erzeugt wird das Object …
1. über einen Cast vom Type “Object”
$a = (object)null; var_dump($a); object(stdClass)#1 (0) { } |
2. über die Klasse stdClass
$b = new stdClass(); var_dump( $b ); object(stdClass)#2 (0) { } |
Die Ausgabe von var_dump() zeigt, das in beiden Fällen ein Objekt vom gleichen Typ erzeugt wird. Ich ziehe die 2. Methode vor, da diese besser zu schreiben und lesen ist als der Typecast.
Die so erzeugen Objekte machen nur Sinn, wenn man sie mit Eigenschaften versehen kann. Das geht wie sonst auch mit Objekten in PHP.
$b = new stdClass(); $b->id = 89; $b->timestamp = time(); var_dump( $b ); object(stdClass)#2 (2) { ["id"]=> int(89) ["timestamp"]=> int(1204223269) } |
Nutz man ein so erzeugtes Objekt als Rückgabewert einer Funktion, so sieht das wie folgt aus:
function foo($a, $b) { $result = new stdClass(); $result->max = max($a, $b); return $result; } var_dump(foo(2, 3)); object(stdClass)#3 (1) { ["max"]=> int(3) } |
Eine Möglichkeit, anonyme Objekte mit Methoden zu versehen habe ich bis dato leider nicht herausfinden können.
Update
Um ein anonymes Objekt gleich beim initialisieren komplexe properties mitzugeben empfiehlt sich dieser Cast eines Arrays:
$o = (object)array('a' => 1, 'b' => 2); var_dump($o); object(stdClass)#1 (2) { ["a"]=> int(1) ["b"]=> int(2) } |
Mit create_function() bzw. mittels Lambda-Funktionen in PHP 5.3 sollten Methoden in stdClass kein Problem darstellen.
Mit create_function kann man aber keine Funktion auf ein stdClass Object hinzufügen.
PHP kann dies nicht korrekt interpretieren.
$foo = new stdClass;
$foo->bar = function(){ echo “bar”; };
oder
$foo->bar=create_function(”,’echo “bar”;’);
$foo->bar();
meldet einen Fehler beim aufruf von $foo->bar(); .
Kann ich denn eine stdClass auf eine eigene Klasse casten?
@tarzanhb, genau das habe ich auch geschrieben. Guck dir zum Thema auch mal @Fabians Kommentar an.
Mir ist kein Weg bekannt, was nicht bedeutet das es nicht gehen könnte. Warum willst du das machen?