Funktionale Programmierung in PHP: Fortgeschrittenes Niveau

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Funktionale Programmierung in PHP: Fortgeschrittenes Niveau

\n\n

Funktionale Programmierung (FP) ist ein Paradigma, bei dem Berechnungen als Berechnung mathematischer Funktionen betrachtet werden und Zustandsänderungen sowie veränderliche Daten vermieden werden. Obwohl PHP ursprünglich nicht als rein funktionale Sprache konzipiert wurde, bietet es ab Version 7.4 und insbesondere in PHP 8.x leistungsstarke Werkzeuge zum Schreiben von Code im funktionalen Stil. In diesem Artikel behandeln wir fortgeschrittene FP-Konzepte in PHP: von Funktionen höherer Ordnung bis zu Monaden, mit praktischen Beispielen und Empfehlungen.

\n\n

1. Funktionen höherer Ordnung und Closures

\n\n

Funktionen höherer Ordnung sind Funktionen, die andere Funktionen als Argumente akzeptieren oder zurückgeben. In PHP wird dies durch anonyme Funktionen (Closures) und die eingebauten Funktionen array_map, array_filter, array_reduce umgesetzt.

\n\n

Beispiel: Rückruffunktion zum Filtern

\n\n
<?php\n$numbers = [1, 2, 3, 4, 5, 6];\n\n// Funktion höherer Ordnung\n$filterEven = function(array $items, callable $callback): array {\n    $result = [];\n    foreach ($items as $item) {\n        if ($callback($item)) {\n            $result[] = $item;\n        }\n    }\n    return $result;\n};\n\n// Anonyme Prädikatfunktion\n$isEven = fn($n) => $n % 2 === 0;\n\n$evenNumbers = $filterEven($numbers, $isEven);\n// Ergebnis: [2, 4, 6]\nprint_r($evenNumbers);\n?>\n
\n\n

Beispiel: Funktionsfabrik (Closure mit Zustand)

\n\n
<?php\nfunction createMultiplier(float $factor): callable {\n    // Closure "merkt" sich $factor\n    return fn($number) => $number * $factor;\n}\n\n$double = createMultiplier(2);\n$triple = createMultiplier(3);\n\necho $double(5); // 10\necho $triple(5); // 15\n?>\n
\n\n

Closures in PHP ermöglichen das Erfassen von Variablen aus dem äußeren Gültigkeitsbereich mittels use (in PHP 7.4+ können Pfeilfunktionen fn verwendet werden). Dies ist die Grundlage für die Umsetzung von Currying und partieller Anwendung.

\n\n

2. Currying und partielle Anwendung

\n\n

Currying ist die Umwandlung einer Funktion mit mehreren Argumenten in eine Folge von Funktionen mit jeweils einem Argument. Partielle Anwendung ist das Fixieren eines Teils der Argumente einer Funktion. PHP bietet keine eingebaute Unterstützung, aber dies ist leicht umsetzbar.

\n\n

Beispiel: Manuelles Currying

\n\n
<?php\n// Normale Funktion\nfunction add(int $a, int $b): int {\n    return $a + $b;\n}\n\n// Curry-Version\n$curriedAdd = function(int $a): callable {\n    return function(int $b) use ($a): int {\n        return $a + $b;\n    };\n};\n\n$addFive = $curriedAdd(5);\necho $addFive(3); // 8\n?>\n
\n\n

Beispiel: Universelle Curry-Funktion

\n\n
<?php\nfunction curry(callable $fn, int $arity = null): callable {\n    $reflection = new ReflectionFunction($fn);\n    $arity = $arity ?? $reflection->getNumberOfRequiredParameters();\n\n    $curry = function(...$args) use ($fn, $arity, &$curry) {\n        if (count($args) >= $arity) {\n            return $fn(...$args);\n        }\n        return function(...$nextArgs) use ($fn, $args, $arity, $curry) {\n            return $curry(...array_merge($args, $nextArgs));\n        };\n    };\n\n    return $curry;\n}\n\n$add = function(int $a, int $b, int $c): int {\n    return $a + $b + $c;\n};\n\n$curriedAdd = curry($add);\n$result = $curriedAdd(1)(2)(3); // 6\necho $result;\n?>\n
\n\n

Currying ist besonders nützlich bei der Funktionskomposition und der Erstellung spezialisierter Versionen allgemeiner Funktionen.

\n\n

3. Funktionskomposition und funktionale Muster

\n\n

Funktionskomposition ist die Erstellung einer neuen Funktion durch die sequenzielle Anwendung mehrerer Funktionen. Das Ergebnis einer Funktion wird als Eingabe an die nächste übergeben.

\n\n

Beispiel: Komposition "von links nach rechts" (pipe)

Blogs

Buchempfehlungen