Javascript macht es seit mehreren Jahren vor, nun folgt PHP. In der Version 5.3 gibt es zahlreiche Neuerungen, die die Sprache erweitern und teilweise das Programmierverhalten stark beeinflussen. Dazu zählen vor allem Closures. Closures sind auch als anonyme Funktionen bekannt und kommen ohne Funktionsnamen aus. Doch der Reihe nach:

Wie im PHP Manual beschrieben, werden Closures ohne Funktionsnamen deklariert. Diese können in Variablen gespeichert oder direkt in weitere Funktionen übergeben werden. Um das Verhalten besser zu erläutern, erstellen wir eine DataMapper Klasse, die mit Hilfe von mapping Closures ein Datenarray verändert.

class DataMapper {
    protected $pool = array();
    protected $maps = array();
    /**
     * Iterates every $item in the $pool
     * @param array &$pool
     * @param mixed $item
     * @return void
     */
    public function transform(&$pool) {
        // don't do anything if the pool is not an array
        if(!is_array($pool)) {
            return;
        }
        // expected format: array(0 => {value}, 1 => {value2}, ...)
        foreach($pool as &$item) {
            // add and map data
            if(!empty($this->maps)) {
                // iterate through all mapping functions
                foreach($this->maps as $map) {
                    $map($item);
                }
            }
        }
    }
    /**
     * Maps Data with a callback function per item
     * @param string $name
     * @param function $callback
     * @return void
     */
    public function map($name, $callback) {
        if(!is_callable($callback)) return;
        $this->maps[$name] = $callback;
    }
}

Das Ganze sieht in einer Beispielimplementierung so aus:

$data = array('test', 'super', 'stark', 'scandio');
// init the data mapper
$dataMapper = new DataMapper();
// add mapping function "length" to the mapping-pool
// "length" takes the length of the string and
// concats the number to it. I.e.: "test" --> "test:4"
$dataMapper->map('length', function(&$element) {
    if(is_string($element)) {
        $element .= ':'.strlen($element);
    }
});
// transform the complete data array
$dataMapper->transform($data);
echo "<pre>";
print_r($data);
echo "</pre>";

Als Ergebnis erhalten wir ein Array bestehend aus Strings mit deren Längenangabe: array(“test:4”, “super:5”, “stark:5”, “scandio:7”). Dieses (zugegebenermaßen wenig praxistaugliche) Beispiel verdeutlicht, wie mit Hilfe von Closures Code vereinfacht und gekapselt werden kann. Die Zeiten in denen man (hoffentlich niemals!) solchen Spagghetti-Code programmierte, sind mit der Einführung von Closures endgültig vorbei:

array_map(create_function('$artist',
        '$artist["info"] = htmlspecialchars($artist["info"]);'
       .'$artist["band"] = htmlspecialchars($artist["band"]);return $artist;'),
    $res
);

Wer PHP 5.3 immer noch skeptisch gegenübersteht, sollte sich das Manual genauer ansehen, da viele Neuerungen das Leben eines jeden Entwicklers einfacher machen.