Einführung in die funktionale Programmierung in PHP
Funktionale Programmierung (FP) ist ein Paradigma, bei dem Berechnungen als Auswertung mathematischer Funktionen betrachtet werden, wobei Zustandsänderungen und veränderliche Daten vermieden werden. Obwohl PHP ursprünglich als imperative Sprache entwickelt wurde, wurden ab Version 5.3 (2009) leistungsstarke Werkzeuge für den funktionalen Stil hinzugefügt: anonyme Funktionen, Closures, Unterstützung für Funktionen höherer Ordnung und vieles mehr.
In diesem Artikel behandeln wir alle wichtigen Konzepte der funktionalen Programmierung in PHP – von grundlegenden anonymen Funktionen bis hin zu fortgeschrittenen Techniken wie Currying und Funktionskomposition. Sie erfahren, wie Sie saubereren, vorhersagbareren und testbareren Code schreiben.
1. Anonyme Funktionen und Closures
Anonyme Funktionen
Eine anonyme Funktion (Lambda) ist eine Funktion ohne Namen. Sie kann einer Variablen zugewiesen, als Argument übergeben oder von einer anderen Funktion zurückgegeben werden.
<?php// Normale anonyme Funktion$square = function($n) { return $n * $n;};
echo $square(5); // 25
// Anonyme Funktion als Callback für array_map$numbers = [1, 2, 3, 4];$squared = array_map(function($n) { return $n * $n;}, $numbers);
print_r($squared); // [1, 4, 9, 16]?>Closures
Ein Closure ist eine anonyme Funktion, die mit dem Schlüsselwort use Variablen aus dem äußeren Gültigkeitsbereich erfassen kann. Dies ist eine der leistungsstärksten FP-Funktionen in PHP.
<?php$multiplier = 3;
$multiply = function($n) use ($multiplier) { return $n * $multiplier;};
echo $multiply(10); // 30
// Veränderliche Variable (als Referenz übergeben)$counter = 0;$increment = function() use (&$counter) { $counter++;};
$increment();$increment();echo $counter; // 2?>2. Reine Funktionen und Unveränderlichkeit von Daten
Reine Funktionen
Eine reine Funktion ist eine Funktion, die:
- Für dieselben Argumente immer dasselbe Ergebnis zurückgibt (deterministisch)
- Keine Seiteneffekte hat (keine externen Variablen ändert, keine Daten ausgibt, nicht mit der Datenbank arbeitet)
<?php// KEINE reine Funktion (abhängig von globaler Variable)$taxRate = 0.2;function calculatePriceDirty($price) { global $taxRate; return $price * (1 + $taxRate);}
// Reine Funktionfunction calculatePricePure($price, $taxRate) { return $price * (1 + $taxRate);}
echo calculatePricePure(100, 0.2); // 120 – immer vorhersagbar?>Unveränderlichkeit (Immutability)
In der FP ist es üblich, vorhandene Daten nicht zu ändern, sondern neue zu erstellen. In PHP können Sie dazu unveränderliche Objekte verwenden oder einfach neue Arrays zurückgeben.
<?php// Schlecht: Änderung des ursprünglichen Arrays$numbers = [1, 2, 3];array_push($numbers, 4); // Mutation
// Gut: Erstellen eines neuen Arrays$numbers = [1, 2, 3];$newNumbers = array_merge($numbers, [4]);
// Funktion, die ein neues Array zurückgibtfunction addItem(array $arr, $item): array { $result = $arr; $result[] = $item; return $result;}
$original = [1, 2];$updated = addItem($original, 3);print_r($original); // [1, 2] – Original unverändertprint_r($updated); // [1, 2, 3]?>3. Funktionen höherer Ordnung: array_map, array_filter, array_reduce
Funktionen höherer Ordnung sind Funktionen, die andere Funktionen als Argumente akzeptieren oder zurückgeben. PHP bietet drei wichtige integrierte Funktionen für die Arbeit mit Arrays im funktionalen Stil.
array_map – Transformation von Elementen
<?php$users = [ ['name' => 'Alice', 'age' => 25], ['name' => 'Bob', 'age' => 30],];
// Nur Namen extrahieren$names = array_map(function($user) { return $user['name'];}, $users);
print_r(