NCA Social Media
Aktualisiert:
Autor:
Roland Golla
Grüne Maschine mit Fragezeichen Slot und Schriftzug Partial Application

Was Partial Function Application in PHP ist

Partial Function Application ist ein Funktionsaufruf, bei dem ein oder mehrere Argumente durch die Platzhalter ? oder ... ersetzt werden. PHP führt die Funktion dann nicht aus, sondern gibt eine Closure zurück, die nur noch die fehlenden Argumente erwartet.
Das Feature kommt mit PHP 8.6. Die RFC von Larry Garfield und Arnaud Le Blanc wurde mit 33 zu 0 Stimmen angenommen. Kurz gesagt: Viele kleine Arrow Functions in Callbacks und Pipes werden überflüssig. Alle weiteren Neuerungen der Version zeigt unser PHP 8 Versionen Vergleich.
Inhalt
NCA KI Workshop für Developer

Agentic Coding im Team, nicht nur im Glossar

Ein Tag inhouse mit Benjamin Klein für Developer, Tester und Admins. Context Engineering, Harness, ADRs und zwei Hands on Blöcke mit KI Agenten in eurem Setup.

  1. 1
    Kostenloses Vorgespräch
    Stand, Rollen und Ziele klären
  2. 2
    Workshoptag bei euch
    Praxis am Vormittag, Hands on danach
  3. 3
    Praxistag optional
    Agenten im eigenen Projekt
Benjamin Klein
Benjamin Klein
Senior Consultant
Zum Workshop für Developer arrow_forward

Partial Function Application mit NCA richtig einordnen

Wir schreiben jeden Tag PHP und Symfony Code für Production und verfolgen neue Sprachfeatures schon in der RFC Phase. Neue Syntax landet bei uns erst dann im Projekt, wenn PHPStan, Psalm, Rector und unser Code Style Tool sie verstehen. Genau diese Reihenfolge schützt euch vor roten Pipelines am Tag nach dem Upgrade.
Wenn ihr Partial Function Application im Team einführen wollt, helfen wir über unser PHP Consulting. Die Umstellung auf PHP 8.6 übernehmen wir im NCA PHP Update, alte Callback Strukturen räumen wir im PHP Refactoring auf. Wie Rector PHP solche Umbauten automatisiert, und warum PHPStan dabei jede Closure prüft, steht in unserem Glossar.

Der Platzhalter ? für genau ein Argument

Ein ? steht für genau ein Argument, das später kommt. Alle anderen Argumente setzt ihr direkt. Heraus kommt eine Closure, die nur noch die offenen Stellen erwartet.
Code:
          

function tag(string $element, string $cssClass, string $content): string
{
    return "<$element class=\"$cssClass\">$content</$element>";
}

$alert = tag('div', 'alert', ?);

echo $alert('Deine Sitzung ist abgelaufen.');
// <div class="alert">Deine Sitzung ist abgelaufen.</div>

Ihr könnt auch mehrere Stellen offen lassen. Die Reihenfolge bleibt dabei die der Originalfunktion. In Callbacks spart das die klassische Arrow Function:
Code:
          

$prices = [19.987, 5.512, 120.049];

// bisher
$rounded = array_map(fn (float $price) => round($price, 2), $prices);

// PHP 8.6
$rounded = array_map(round(?, 2), $prices);

Der Platzhalter ... für alle restlichen Argumente

Der Platzhalter ... deckt alle übrigen Argumente ab. Ihr kennt ihn schon aus PHP 8.1: strtolower(...) erzeugt dort eine Closure für die ganze Funktion, die sogenannte First Class Callable Syntax. PHP 8.6 erweitert das. Jetzt dürfen vor den drei Punkten schon Argumente stehen.
Code:
          

$div = tag('div', ...);

echo $div('alert', 'Deine Sitzung ist abgelaufen.');

Auch benannte Argumente funktionieren mit Platzhaltern. Bei langen Signaturen liest sich das deutlich besser:
Code:
          

$alert = tag(element: 'div', cssClass: 'alert', content: ?);

Die Closure behält Typen und Signatur

Die erzeugte Closure übernimmt Parameternamen, Typen, Rückgabetyp und Referenzverhalten der Originalfunktion. Reflection und statische Analyse sehen also eine echte, typisierte Funktion. Für Tools wie PHPStan und Psalm ist das ein großer Vorteil gegenüber einer losen Arrow Function ohne Typen.
Eine Folge RFC regelt Default Werte. Jeder ? wird zu einem Pflichtparameter der Closure, auch wenn der Originalparameter einen Default hat. Parameter, die über ... hereinkommen, behalten dagegen ihren optionalen Status und ihren Default.
Ein wichtiger Unterschied zur Arrow Function: Die Argumente einer Partial Function Application werden sofort ausgewertet, also beim Erzeugen der Closure. Bei einer Arrow Function passiert das erst beim Aufruf. Wer teure Funktionsaufrufe als Argument übergibt, sollte das wissen.

Partial Function Application und der Pipe Operator

Der Pipe Operator |> aus PHP 8.5 braucht in jedem Schritt eine Funktion mit genau einem Parameter. Viele nützliche Funktionen haben aber zwei oder mehr. Bisher landete deshalb wieder eine Arrow Function in der Pipe. Mit PHP 8.6 markiert ein ? die Stelle, an der der Wert aus der Pipe ankommt.
Code:
          

$slug = ' PHP 8.6 Release Notes '
    |> trim(...)
    |> strtolower(...)
    |> str_replace(' ', '-', ?);

// "php-8.6-release-notes"

Code:
          

$total = $lineItems
    |> array_map(fn (Item $item) => $item->price, ?)
    |> array_sum(...);

Steht eine Partial Function Application direkt rechts vom Pipe Operator und nimmt sie nachweislich genau ein Argument, kann PHP die Zwischen Closure komplett weglassen. Es bleibt ein direkter Funktionsaufruf. Komplexere Fälle erzeugen weiterhin eine normale Closure.

Partial Function Application im Vergleich

Schreibweise Beispiel Eigenschaften
Arrow Function seit PHP 7.4 fn (float $p) => round($p, 2) Flexibel, Typen müsst ihr selbst schreiben, Argumente werden erst beim Aufruf ausgewertet
First Class Callable seit PHP 8.1 strtolower(...) Closure für die ganze Funktion, keine vorbelegten Argumente
Partial Function Application ab PHP 8.6 round(?, 2) Vorbelegte Argumente, Signatur und Typen werden übernommen, Argumente werden sofort ausgewertet

So führt ihr Partial Function Application im Team ein

Neue Syntax ist schnell geschrieben. Damit sie im Team funktioniert, braucht es ein paar Schritte vorher.
  • Werkzeuge prüfen: Versteht eure Version von PHPStan, Psalm, Rector und dem Code Style Tool schon Platzhalter? Sonst bricht die Pipeline beim ersten Commit.
  • Mindestversion festlegen: Partial Function Application ist reine PHP 8.6 Syntax. Bibliotheken, die ältere Versionen unterstützen, können sie noch nicht nutzen.
  • Regeln vereinbaren: Legt fest, wann ihr ? statt Arrow Function schreibt, zum Beispiel in Callbacks und Pipes. Haltet das in euren Coding Standards fest.
  • Schrittweise umbauen: Stellt bestehenden Code nicht in einem großen Commit um. Kleine Merge Requests mit Tests sind leichter zu prüfen.
Wie ein sauberes Upgrade auf PHP 8.6 abläuft, zeigt unser Glossar zum PHP 8.6 Upgrade. Für die Regeln eurer Codebasis lohnt ein Blick auf die Symfony Coding Standards.

PFA is a core feature of a number of functional languages.

Larry Garfield, Co Autor der RFC Partial Function Application v2 – PHP RFC Partial Function Application v2

Die NCA Erfahrung mit neuen PHP Sprachfeatures

Neue Sprachfeatures sind bei uns nie Selbstzweck. Sie kommen ins Projekt, wenn sie Code lesbarer machen und die Quality Gates mitspielen. Dazu gehören PHPUnit für Tests, PHPStan und Psalm für statische Analyse und Type Coverage, um zu sehen, wie viel Code wirklich typisiert ist. Wie Rector Code umbaut, ohne ihn zu zerbrechen, erklärt das Glossar zum Abstract Syntax Tree.
Partial Function Application passt besonders gut zu sauber geschnittener Fachlogik. Wer seine Domäne mit Domain Driven Design strukturiert, profitiert von kleinen, typisierten Funktionen, die sich zu Pipes verbinden lassen. Im Symfony Framework nutzen wir das in Services und Event Handlern. Und wenn Coding Agents mitschreiben, geben die NCA PHP AI Coding Guidelines klare Regeln für neue Syntax vor. Abgerechnet wird transparent: kostenloses Kennenlernen, Aufwand schätzen, minutengenau abrechnen.
CYPRESS.IO Ambassador und IT Consultant für QA Engenieering und Qualität in PHP Projekten.
Erreichen Sie unsere PHP Consultant Spezialisten

Wir sind Experten für PHP und helfen Ihnen, Ihre digitalen Herausforderungen zu meistern. Unser erfahrenes Team unterstützt Sie bei PHP Updates, PHP Refactoring und berät Sie remote zu allen Fragen rund um PHP. Mit unseren vollautomatischen CI/CD Deployments und einer robusten Docker-Infrastruktur bringen wir Ihre PHP-Projekte auf das nächste Level. Vertrauen Sie auf unsere Expertise für zuverlässige und skalierbare PHP-Lösungen.

Häufige Fragen zu Partial Function Application

Die wichtigsten Antworten zu Syntax, Platzhaltern, Pipe Operator und Einsatz im Team.
Was ist Partial Function Application in PHP 2026?

Partial Function Application ist ein Funktionsaufruf, bei dem Argumente durch die Platzhalter ? oder ... ersetzt werden. PHP führt die Funktion dann nicht aus, sondern liefert eine typisierte Closure, die nur noch die fehlenden Argumente erwartet. So ersetzt array_map(round(?, 2), $prices) eine komplette Arrow Function.

Ab welcher Version gibt es Partial Function Application 2026?

Partial Function Application kommt mit PHP 8.6. Das Release ist für den 19. November 2026 geplant, Release Candidates zum Testen gibt es schon. Die RFC von Larry Garfield und Arnaud Le Blanc wurde mit 33 zu 0 Stimmen angenommen und ist seit Alpha 3 im PHP Kern.

Was ist 2026 der Unterschied zwischen ? und ... in PHP?

Das Fragezeichen steht für genau ein Argument, das später kommt. Die drei Punkte stehen für alle restlichen Argumente. Mit ? legt ihr also einzelne Stellen fest, mit ... lasst ihr den Rest offen. Beide lassen sich mit festen und benannten Argumenten kombinieren.

Ersetzt Partial Function Application 2026 Arrow Functions?

In vielen Callbacks und Pipes ja. Wo eine Arrow Function nur eine andere Funktion mit festen Argumenten aufruft, ist round(?, 2) kürzer und übernimmt die Typen automatisch. Für eigene Logik, Bedingungen oder mehrere Aufrufe bleibt die Arrow Function aber das richtige Werkzeug.

Wie hängt der Pipe Operator 2026 mit Partial Function Application zusammen?

Der Pipe Operator aus PHP 8.5 braucht in jedem Schritt eine Funktion mit einem Parameter. Mit Partial Function Application markiert ein ? die Stelle, an der der Wert aus der Pipe ankommt. Steht der Aufruf direkt rechts vom Operator, kann PHP die Zwischen Closure sogar ganz weglassen.

Was ist der Unterschied zur First Class Callable Syntax?

Die First Class Callable Syntax aus PHP 8.1, etwa strtolower(...), erzeugt eine Closure für die ganze Funktion ohne vorbelegte Argumente. Partial Function Application ist die Erweiterung davon. Vor oder zwischen den Platzhaltern dürfen jetzt feste Argumente stehen.

Behält die Closure die Typen der Originalfunktion?

Ja. Die Closure übernimmt Parameternamen, Typen, Rückgabetyp und Referenzverhalten der Originalfunktion. Reflection und statische Analyse sehen eine echte, typisierte Funktion. Das ist ein Vorteil gegenüber Arrow Functions, bei denen ihr die Typen selbst schreiben müsst.

Was passiert mit Default Werten bei Platzhaltern?

Jedes Fragezeichen wird zu einem Pflichtparameter der Closure, auch wenn der Originalparameter einen Default hat. Parameter, die über die drei Punkte hereinkommen, bleiben optional und behalten ihren Default. Das regelt eine eigene Folge RFC zu optionalen Platzhaltern.

Wann werden die Argumente ausgewertet?

Sofort beim Erzeugen der Closure. Das ist ein Unterschied zur Arrow Function, die ihre Argumente erst beim Aufruf auswertet. Wenn ihr teure Funktionsaufrufe als festes Argument übergebt, laufen sie also schon beim Anlegen der Closure, nicht erst später.

Ist Partial Function Application ein Breaking Change?

Nein. Die RFC führt neue Syntax ein und listet keine inkompatiblen Änderungen. Bestehender Code läuft unverändert weiter. Ihr könnt das Feature schrittweise einführen, sobald eure Mindestversion PHP 8.6 ist und eure Werkzeuge die neue Syntax verstehen.

Verstehen PHPStan und Rector die neue Syntax schon?

Prüft die Version eurer Werkzeuge, bevor ihr die Syntax nutzt. Statische Analyse, Rector und Code Style Tools brauchen Updates für neue Sprachfeatures. Ein Pipeline Job mit dem PHP 8.6 Release Candidate zeigt euch schnell, ob alles zusammenspielt, bevor neuer Code im Hauptzweig landet.

Kann ich Partial Function Application in Bibliotheken nutzen?

Nur, wenn eure Bibliothek PHP 8.6 als Mindestversion voraussetzt. Die Syntax lässt sich auf älteren Versionen nicht parsen. Für Pakete mit breiter Versionsunterstützung bleibt ihr also vorerst bei Arrow Functions und stellt erst um, wenn ihr ältere PHP Versionen nicht mehr unterstützt.