RSS Feed

Anonyme Objekte mit PHP

28.02.2008 by naden

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)
}

5 Kommentare »

  1. Fabian sagt:

    Mit create_function() bzw. mittels Lambda-Funktionen in PHP 5.3 sollten Methoden in stdClass kein Problem darstellen.

  2. tarzanhb@twitter sagt:

    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(); .

  3. Steffen sagt:

    Kann ich denn eine stdClass auf eine eigene Klasse casten?

  4. naden sagt:

    @tarzanhb, genau das habe ich auch geschrieben. Guck dir zum Thema auch mal @Fabians Kommentar an.

  5. naden sagt:

    Mir ist kein Weg bekannt, was nicht bedeutet das es nicht gehen könnte. Warum willst du das machen?

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>