Funktionsparameter
Mit einer Parameterliste kann man Informationen an eine Funktion
übergeben. Die Parameterliste ist eine durch Kommas getrennte Liste von
Ausdrücken. Die Parameter werden von links nach rechts ausgewertet, bevor
die eigentliche Funktion aufgerufen wird, d. h. mit der sog.
eager Evaluation (dt. eifrige Auswertung).
PHP unterstützt die Weitergabe von Parametern als Werte (das ist der
Standard), als
Verweise und als
Vorgabewerte. Eine
variable Anzahl von Parametern
und benannte Parameter werden
ebenfalls unterstützt.
Beispiel #1 Arrays an Funktionen übergeben
<?php
function nimm_array($eingabe)
{
echo "$eingabe[0] + $eingabe[1] = ", $eingabe[0]+$eingabe[1];
}
?>
Seit PHP 8.0.0 kann die Liste der Funktionsparameter ein nachgestelltes
Komma enthalten, das ignoriert wird. Das ist besonders nützlich in Fällen,
in denen die Liste der Parameter lang ist oder lange Variablennamen
enthält, sodass es praktisch ist, die Parameter vertikal aufzulisten.
Beispiel #2 Liste von Funktionsparametern mit nachgestelltem Komma
<?php
function takes_many_args(
$first_arg,
$second_arg,
$a_very_long_argument_name,
$arg_with_default = 5,
$again = 'a default string', // Dieses nachgestellte Komma war vor 8.0.0
// nicht erlaubt.
)
{
// ...
}
?>
Parameter als Verweise übergeben
Normalerweise werden den Funktionen Werte als Parameter übermittelt. Wenn
man also den Wert dieser Parameter innerhalb der Funktion ändert, bleiben
sie außerhalb der Funktion unverändert. Wollen Sie aber erreichen, dass
die Änderung auch außerhalb der Funktion sichtbar wird, müssen Sie die
Parameter als Verweise (Referenzen) übergeben.
Wenn eine Funktion einen Parameter generell als Verweis behandeln soll,
setzt man in der Funktionsdefinition ein kaufmännisches Und (&) vor
den Parameternamen:
Beispiel #3 Übergeben von Funktionsparametern als Verweis
<?php
function fuege_etwas_an(&$string)
{
$string .= 'und etwas mehr.';
}
$str = 'Dies ist ein String, ';
fuege_etwas_an($str);
echo $str; // Ausgabe: 'Dies ist ein String, und etwas mehr.'
?>
Es ist ein Fehler, einen Wert als Parameter zu übergeben, der eigentlich
als Referenz übergeben werden müsste.
Vorgabewerte für Parameter
Eine Funktion kann Standardwerte für Parameter definieren, indem sie eine
ähnliche Syntax wie bei der Zuweisung von Variablen verwendet. Der
Standardwert wird nur verwendet, wenn der Parameter nicht angegeben ist.
Dabei ist insbesondere zu beachten, dass bei der Übergabe von null
nicht der Standardwert zugewiesen wird.
Beispiel #4 Einsatz von Vorgabeparametern in Funktionen
<?php
function machkaffee($typ = "Cappuccino")
{
return "Ich mache eine Tasse $typ.\n";
}
echo machkaffee();
echo machkaffee(null);
echo machkaffee("Espresso");
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Ich mache eine Tasse Cappuccino.
Ich mache eine Tasse .
Ich mache eine Tasse Espresso.
Die Standardwerte der Parameter können skalare Werte,
Arrays, der spezielle Typ null
und seit PHP 8.1.0 auch
Objekte sein, die die
new ClassName()-Syntax
verwenden.
Beispiel #5 Nichtskalare Typen als Vorgabewert
<?php
function makecoffee($types = array("Cappuccino"), $coffeeMaker = NULL)
{
$device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
return "Ich mache eine Tasse ".join(", ", $types)." mit $device.\n";
}
echo makecoffee();
echo makecoffee(array("Cappuccino", "Lavazza"), "Teekanne");
?>
Beispiel #6 Verwendung von Objekten als Standardwerte (seit PHP 8.1.0)
<?php
class DefaultCoffeeMaker {
public function brew() {
return 'Koche Kaffee.';
}
}
class FancyCoffeeMaker {
public function brew() {
return 'Bereite einen schönen Kaffee für Dich zu.';
}
}
function makecoffee($coffeeMaker = new DefaultCoffeeMaker)
{
return $coffeeMaker->brew();
}
echo makecoffee();
echo makecoffee(new FancyCoffeeMaker);
?>
Der Vorgabewert muss ein konstanter Ausdruck sein, darf also zum Beispiel
keine Variable, keine Eigenschaft einer Klasse und kein Funktionsaufruf
sein.
Es ist zu beachten, dass optionale Parameter nach den erforderlichen
Parametern angegeben werden müssen, da sie sonst bei einem Aufruf nicht
weggelassen werden können. Das nachfolgende Beispiel verdeutlicht dies:
Beispiel #7 Ungültige Verwendung von Vorgabewerten
<?php
function mach_joghurt($typ = "rechtsdrehendes", $geschmack)
{
return "Mache einen Becher $typ $geschmack-Joghurt.\n";
}
echo mach_joghurt("Brombeer"); // "Brombeer" ist $typ, nicht $geschmack
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Fatal error: Uncaught ArgumentCountError: Too few arguments
to function makeyogurt(), 1 passed in example.php on line 42
Zum Vergleich mit obigem Beispiel::
Beispiel #8 Richtiger Einsatz von Vorgabewerten
<?php
function mach_joghurt($geschmack, $typ = "rechtsdrehendes")
{
return "Mache einen Becher $typ $geschmack-Joghurt.\n";
}
echo mach_joghurt("Brombeer"); // "Brombeer" ist $geschmack
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Mache einen Becher rechtsdrehendes Brombeer-Joghurt.
Seit PHP 8.0.0 können
benannte Parameter
verwendet werden, um mehrere optionale Parameter zu überspringen.
Beispiel #9 Korrekte Verwendung von Funktionsparametern mit Standardwerten
<?php
function makeyogurt($container = "bowl", $flavour = "raspberry", $style = "Greek")
{
return "Making a $container of $flavour $style yogurt.\n";
}
echo makeyogurt(style: "natural");
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Making a bowl of raspberry natural yogurt.
Seit PHP 8.0.0 wird die Angabe von obligatorischen Parametern nach
optionalen Parametern missbilligt. Dies kann im
Allgemeinen durch das Weglassen des Standardwertes gelöst werden, da er
nie verwendet wird. Eine Ausnahme von dieser Regel sind Parameter der Form
Type $param = null
, wobei der Standardwert null
den Typ
implizit nullbar macht. Diese Verwendung bleibt erlaubt, obwohl empfohlen
wird, stattdessen einen explizit
nullbaren Typ
zu verwenden.
Beispiel #10 Angabe von optionalen Parametern nach obligatorischen Parametern
<?php
function foo($a = [], $b) {} // Seit PHP 8.0.0 veraltet; Standardwert wird nicht verwendet
function foo($a, $b) {} // Funktionell identisch, aber ohne Veraltet-Hinweis
function bar(A $a = null, $b) {} // Noch erlaubt; $a wird benötigt, kann aber null sein
function bar(?A $a, $b) {} // Empfohlen
?>
Hinweis:
Seit PHP 7.1.0 wird ein ArgumentCountError
ausgelöst, wenn ein Parameter weggelassen wird, für den kein Standardwert
angegeben ist; in früheren Versionen löste es eine Warnung aus.
Hinweis:
Parameter, die per Verweis übergeben werden, dürfen einen Standardwert
haben.
Variable Anzahl von Parametern
PHP unterstützt eine variable Anzahl an Parametern in benutzerdefinierten
Funktionen durch Verwendung des ...
-Tokens.
Eine Liste von Parametern kann das Token ...
enthalten, um anzugeben, dass die Funktion eine variable Anzahl von
Parametern akzeptiert. Die zusätzlichen Werte werden als Array an die
entsprechende Variable übergeben:
Beispiel #11 Verwendung von ...
für den Zugriff auf variable Parameter
<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Das Token ...
kann auch dazu verwendet werden, um ein
Array oder ein Traversable-Objekt als
Liste von Parametern zu übergeben:
Beispiel #12 Verwendung von ...
zur Übergabe einer Parameterliste
<?php
function add($a, $b) {
return $a + $b;
}
echo add(...[1, 2])."\n";
$a = [1, 2];
echo add(...$a);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Die Definition von regulären, positionierten Parametern vor dem
...
ist natürlich weiterhin möglich. In einem solchen
Fall werden dann nur die zusätzlichen Werte, die zu keinem positionierten
Parameter gehören, in das durch ...
erzeugte Array
übernommen.
Es ist zudem auch möglich, dem ...
-Token eine
Typdeklaration
voranzustellen. Ist dies der Fall, dann müssen alle Parameter, die von
...
erfasst werden, vom entsprechenden Typ sein.
Beispiel #13 Variable Parameter mit Typdeklaration
<?php
function total_intervals($unit, DateInterval ...$intervals) {
$time = 0;
foreach ($intervals as $interval) {
$time += $interval->$unit;
}
return $time;
}
$a = new DateInterval('P1D');
$b = new DateInterval('P2D');
echo total_intervals('d', $a, $b).' days';
// Dieser Aufruf wird scheitern, da null keine Instanz von DateInterval ist
echo total_intervals('d', null);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
3 days
Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2
Durch ein voran gestelltes &
ist auch die Übergabe
von variablen Parametern
als Referenz
möglich.
Benannte Parameter
PHP 8.0.0 führt benannte Parameter als eine Erweiterung der bestehenden
Positionsparameter ein. Benannte Parameter ermöglichen die Übergabe von
Parametern an eine Funktion basierend auf dem Parameternamen und nicht
auf der Position des Parameters. Das macht die Bedeutung von Parametern
selbsterklärend, macht die Parameter unabhängig von der Reihenfolge und
ermöglicht das willkürliche Überspringen von Standardwerten.
Benannte Parameter werden übergeben, indem dem Wert der Parametername
gefolgt von einem Doppelpunkt vorangestellt wird. Reservierte
Schlüsselwörter dürfen als Parameternamen verwendet werden. Der
Parametername muss ein Bezeichner sein; eine dynamische Angabe ist nicht
erlaubt.
Beispiel #14 Syntax benannter Parameter
<?php
myFunction(paramName: $value);
array_foobar(array: $value);
// Wird NICHT unterstützt
function_name($variableStoringParamName: $value);
?>
Beispiel #15 Positionsparameter im Vergleich zu benannten Parametern
<?php
// Verwendung von Positionsparametern:
array_fill(0, 100, 50);
// Verwendung von benannten Parametern:
array_fill(start_index: 0, count: 100, value: 50);
?>
Die Reihenfolge, in der die benannten Parameter übergeben werden, spielt
keine Rolle.
Beispiel #16 Das gleiche Beispiel wie oben mit einer anderen Reihenfolge der Parameter
<?php
array_fill(value: 50, count: 100, start_index: 0);
?>
Benannte Parameter können mit Positionsparametern kombiniert werden. In
diesem Fall müssen die benannten Parameter nach den Positionsparametern
kommen. Es ist auch möglich, nur einige der optionalen Parameter einer
Funktion anzugeben, unabhängig von ihrer Reihenfolge.
Beispiel #17 Kombinieren von benannten Parametern mit Positionsparametern
<?php
htmlspecialchars($string, double_encode: false);
// Ist das Gleiche wie
htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, 'UTF-8', false);
?>
Die mehrfache Übergabe desselben Parameters führt zu einer Error-Exception.
Beispiel #18 Die mehrfache Übergabe desselben Parameters erzeugt einen Fehler
<?php
function foo($param) { ... }
foo(param: 1, param: 2);
// Error: Named parameter $param overwrites previous argument
foo(1, param: 2);
// Error: Named parameter $param overwrites previous argument
?>
Seit PHP 8.1.0 ist es möglich, benannte Parameter nach dem Entpacken von
Parametern zu verwenden. Ein bereits entpackter Parameter
darf nicht durch einen benannten Parameter
überschrieben werden.
Beispiel #19 Verwendung benannter Parameter nach dem Entpacken
<?php
function foo($a, $b, $c = 3, $d = 4) {
return $a + $b + $c + $d;
}
var_dump(foo(...[1, 2], d: 40)); // 46
var_dump(foo(...['b' => 2, 'a' => 1], d: 40)); // 46
var_dump(foo(...[1, 2], b: 20)); // Fataler Fehler. Der benannte Parameter $b überschreibt den vorherige Parameter
?>