PHP 5.3: Closures

von Jan Pieper | 2 | 12642 Aufrufe

Anzeige Hier werben

Nach Sprachen wie LUA, Python, Javascript etc. wird es ab der Version 5.3 auch in PHP möglich sein, Funktionen mit einem Zustand zu deklarieren. Dafür können der Funktion, bei ihrer Deklaration, Variablen, aus dem aktuellen Gültigkeitsbereich, zugewiesen werden. In Klassenmethoden wird einer Lambda Funktion die Variable $this implizit (automatisch) zugewiesen.

Einfaches Beispiel  
PHP
1
2
3
4
5
6
7
8
9
<?php

$x = 12;
$closure = function($a) use ($x) {
    return $x - $a;
};
$closure(4); // int(8)

?>

Der Lamda Funktion wird in diesem Beispiel, bei ihrer Deklaration, die Variable $x übergeben. Diese Variable ist der Funktion so lange bekannt, wie die Funktion selbst existiert. In use(...) können mehrere Variablen kommasepariert eingetragen werden.

Closures werden z.B. für Callbacks gebraucht, da man z.B. zum Zeitpunkt, an dem die Funktion als Callback aufgerufen wird, den Zustand benötigt, wie er war, als die Funktion deklariert wurde, und nicht, wie er aktuell (vllt. 100 Zeilen später) ist. Zwischen Deklaration und Aufruf der Funktion kann nämlich so einiges passieren.

Beispiel  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php

$status = 200;
$closure = function($result) use ($status) {
    return ($result == $status);
}

/* 100 Zeilen Code */

$status = 300;

/* 100 Zeilen Code */

$closure(200); // bool(true)
$closure(300); // bool(false)

?>

Hier kann man sehen, dass der Funktion zur Deklaration die Variable $status übergeben wird. Obwohl sich der Inhalt der Variable $status im weiteren Verlauf des Scripts ändert, weiß die Funktion immernoch, dass der Wert 200 war. Wenn man nun die Funktion mit dem Parameter 200 aufruft bekommt man den boolschen Wert true zurückgeliefert, da dieser gleich dem Inhalt der $status Variable zur Deklarationszeit ist.

Dem use(...) können auch Referenzen gegeben werden. In dem Fall hat die Variable in der Funktion beim Aufruf den Wert, den die Variable aktuell im Script hat. Also unbedingt nicht den Wert, den sie bei Deklaration der Funktion hatte.

Nutzung einer Referenz  
PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php

$status = 200;
$closure = function($result) use (&$status) {
    return ($result == $status);
}

/* 100 Zeilen Code */

$status = 300;

/* 100 Zeilen Code */

$closure(200); // bool(false)
$closure(300); // bool(true)

?>

Nun ist der Wert der Variable $status, innerhalb der Funktion, nicht mehr 200 sondern 300, da der Inhalt sich im Ablauf des Skripts geändert hat.

Über den Autor: Jan Pieper
arbeitet bei der Host Europe GmbH als Software Entwickler und beschäftigt sich seit über 10 Jahren mit der Entwicklung von dynamischen Webanwendungen.
Profilseite betrachten