MWCodebymw.de ↗
PHP

Benannte Argumente in PHP 8 – Schluss mit true, false, null, true

Ein Aufruf wie erstelle($a, true, false, null, true) sagt nichts darüber, was die Wahrheitswerte bedeuten. Mit benannten Argumenten steht es im Aufruf – und optionale Parameter lassen sich überspringen.

Jede gewachsene Codebasis hat diese Aufrufe:

$pdf = erzeuge($daten, true, false, null, true, 'A4');

Was ist true? Was false? Man scrollt zur Signatur, zählt Positionen ab, und hofft, dass sich nichts verschoben hat. PHP 8 löst das.

Namen statt Positionen

function erzeuge(
    array $daten,
    bool $kopfzeile = true,
    bool $seitenzahlen = false,
    ?string $wasserzeichen = null,
    bool $komprimieren = true,
    string $format = 'A4',
): string { /* … */ }

$pdf = erzeuge(
    daten: $daten,
    seitenzahlen: true,
    format: 'A5',
);

Drei Dinge auf einmal: Der Aufruf erklärt sich selbst, die Reihenfolge ist egal, und alles, was du nicht nennst, behält seinen Standardwert – kein null, null, null mehr, nur um an den letzten Parameter zu kommen.

Besonders angenehm bei den Standardfunktionen

// Ohne Namen muss man wissen, was die 4. Stelle tut:
$json = json_encode($wert, JSON_PRETTY_PRINT, 512);

// Mit Namen:
$json = json_encode($wert, flags: JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR);
$teil = str_contains(haystack: $text, needle: 'Rechnung');
$liste = array_slice($werte, offset: 0, length: 10, preserve_keys: true);

Zusammen mit Constructor Promotion

final class Auftrag
{
    public function __construct(
        public readonly string $kunde,
        public readonly int $menge = 1,
        public readonly ?string $notiz = null,
        public readonly bool $eilig = false,
    ) {}
}

$a = new Auftrag(kunde: 'Muster GmbH', eilig: true);

Das ist der Punkt, an dem PHP sich anfühlt wie eine Sprache mit Wertobjekten: ein Konstruktor, sprechende Aufrufe, keine Setter-Kette.

Mischen erlaubt – in dieser Reihenfolge

$pdf = erzeuge($daten, seitenzahlen: true);        // erst Position, dann Namen: ok
// $pdf = erzeuge(daten: $daten, true);            // Fehler: positional nach benannt

Auch beim Entpacken funktioniert es, wenn das Array String-Schlüssel hat:

$optionen = ['format' => 'A5', 'seitenzahlen' => true];
$pdf = erzeuge($daten, ...$optionen);

Fallstrick

Mit benannten Argumenten werden Parameternamen Teil deiner öffentlichen Schnittstelle. Wer $kunde in $auftraggeber umbenennt, bricht jeden Aufruf, der den Namen benutzt – in einer Bibliothek ist das eine Breaking Change. Zweitens: Bei internen PHP-Funktionen sind die Namen erst seit PHP 8.0 verlässlich dokumentiert, und einzelne wurden seitdem korrigiert; wenn du eine alte Version unterstützen musst, halte dich dort an Positionen.

Gut lesbarer Code spart bei jeder späteren Änderung Geld. Wenn du dabei Unterstützung brauchst: bymw.de.

Quellen

#PHP#PHP 8#Lesbarkeit#Funktionen#Argumente

Du brauchst mehr als ein Snippet?

Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.

Projekt anfragen →