Ich konnte es nicht lassen und hab mir den PHP Trunk draufgemacht, um mal etwas mit dem Dereferencing herumzuspielen. Die Version im Trunk hört auf 5.3.99 und kann für die SVN-faulen als Snapshot hier geladen werden. Gleich mal etwas Konsolenromantik:
dav@david:/var/www$ php --version PHP 5.3.99-dev (cli) (built: Mar 28 2011 21:51:08) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2011 Zend Technologies dav@david:/var/www$ cat dereferencing.php <?php function test() { return array("foo" => "bar"); } print "Output: " . test()["foo"] . "\n"; dav@david:/var/www$ php dereferencing.php Output: bar
Joa, was soll ich sagen? Geht alles genauso, wie man sich das wünscht. Um mal ein komplexeres, sinnloses Beispiel auf den Tisch zu legen:
<?php class Calc { public static function getClosureManager() { return new ClosureManager; } } class ClosureManager { function getSquareClosure() { return array("closure" => function($s) { return array("result" => $s * $s); }); } } $c = Calc::getClosureManager()->getSquareClosure()["closure"]; print $c(4)["result"] . "\n";
Geht also auch mit Closures und all dem OOP Schnickschnack. Bei der Bastelei sind mir auch gleich wieder 2 neue Wünsche eingefallen.
Ich hätte gerne…
class Calc { function square($s) { return $s * $s; } } print (new Calc)->square(4);
Java hat da kein Problem mit. Und dann noch das (zugegebenmaßen eher akademische, aus Javascript bekannte) Konstrukt:
function getClosure() { return function($s) { return $s * $s; } } print getClosure()(5);
Also eine zurückgegebene Closure direkt aufrufen können, ohne sie vorher in einer Variable zwischenspeichern zu müssen. Aber sterben werde ich auch so nicht.
Wieder eins weniger, dass die „tollen Python und C Programmierer“ als „das Totschlagargument“ gegen PHP verkaufen können.
Woho! Das geht in C? Kannste grad mal ein kleines Codebeispiel dazu hinzimmern?
Ich kenne mich mit C nicht wirklich aus (ausser Klicki-Bunti in QT). Aber ich hab das schon öfter lesen dürfen, dass das ja gar nicht in PHP geht und die Sprache deshalb untergehen muss.