PHP 8.6 führt Partial Function Application (PFA) ein. Die Funktion ist derzeit als Beta verfügbar. Die Veröffentlichung ist für einen Termin um den 19. November 2026 geplant.
PHP 8.1 brachte die First-Class Callable Syntax. Damit wird eine vorhandene Funktion mit einer Schreibweise wie `trim(...)` als Callable verwendet, auch in Funktionen wie `array_map()`. Ausgewählte Argumente lassen sich damit nicht vorab binden. PFA schließt diese Lücke. Ein Ausdruck wie `str_replace(' ', '-', ?)` erzeugt ein Callable, das den offenen Wert später entgegennimmt.
Das Zeichen `?` steht für genau ein Argument, das beim Aufruf geliefert wird. Mehrere Platzhalter sind möglich. Sie dürfen zwischen festen positionellen oder benannten Argumenten stehen. Die Reihenfolge ist festgelegt: Zuerst kommen positionelle Werte und Platzhalter, danach benannte Argumente. Höchstens ein abschließendes `...` ist erlaubt, und es muss am Ende stehen. Das Ellipsis-Zeichen lässt alle übrigen Argumentplätze offen.
PFA eignet sich für APIs, die Callables erwarten. `array_map()` kann direkt `str_replace('hello', 'hi', ?)` als Callback erhalten. Bei `array_filter()` bleibt `mode: ?` offen, `is_numeric(...)` liefert den festen Callback, und ein abschließendes `...` verschiebt das Array auf den späteren Aufruf. Das neue Callable kann dann etwa `0` und `[1, 'a', 2, 'b', 3]` positionell oder `mode: 0` und `array: [1, 'a', 2, 'b', 3]` mit Namen erhalten.
`...` erlaubt auch verzögerte Ausführung. Ein aus `printf('Hello, %s!' . PHP_EOL, ...)` erzeugtes Callable kann erst bei Bedarf aufgerufen werden. Mit dem Pipe-Operator nimmt `str_replace(' ', '-', ?)` den Wert aus der Pipeline auf. Die Technik funktioniert bei statischen und bei Instanzmethoden. Die Beispiele verwenden `Book::create(category: Category::THRILLER, title: ?)` sowie `$book->publish(new DateTimeImmutable(), ...)`.
Feste Argumente werden beim Erzeugen des partiellen Callables ausgewertet. Im Beispiel mit `getPrefix()` erscheint `Called!`, die Funktion liefert `PHP`, und dieser Aufruf geschieht sofort. Der Rückgabewert wird für spätere Aufrufe wie `$partial('Alice')` und `$partial('Bob')` gespeichert. Eine normale Closure wertet einen Ausdruck wie `getPrefix()` bei jedem Aufruf aus.
PFA erzeugt eine neue Closure. Die vollständigen Metadaten des ursprünglichen Callables bleiben dabei nicht erhalten. Benutzerdefinierte Attribute wie `#[MyAttribute]` gehen verloren. `#[NoDiscard]` und `#[SensitiveParameter]` bilden Ausnahmen. `#[SensitiveParameter]` bleibt erhalten, wenn der betreffende Parameter offen bleibt. Reflection-Code muss diesen Unterschied berücksichtigen. Der Artikel weist außerdem auf nicht unterstützte spezielle Konstrukte hin, nennt sie aber nicht einzeln.




Kommentare
Noch keine Kommentare — schreib den ersten.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.