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.

Hinweis: Es ist außerdem möglich eine variable Anzahl an Parametern durch Verwendung von func_num_args(), func_get_arg(), und func_get_args() zu realisieren. Diese Technik wird nicht empfohlen, da sie vor der Einführung des ...-Tokens verwendet wurde.

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. Zum Beispiel:

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(1234);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

10

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(...[12])."\n";

$a = [12];
echo 
add(...$a);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

3
3

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($unitDateInterval ...$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.

Ältere Versionen von PHP

Eine spezielle Syntax ist zur Definition von variablen Parametern nicht notwendig. Allerdings müssen die Funktionen func_num_args(), func_get_arg() und func_get_args() verwendet werden, um auf die übergebenen Werte zugreifen zu können.

Das erste Beispiel von weiter oben würde in alten PHP-Versionen so umgesetzt werden können:

Beispiel #14 Zugriff auf variable Parameter in alten PHP-Versionen

<?php
function sum() {
    
$acc 0;
    foreach (
func_get_args() as $n) {
        
$acc += $n;
    }
    return 
$acc;
}

echo 
sum(1234);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

10

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 #15 Syntax benannter Parameter

<?php
myFunction
(paramName$value);
array_foobar(array: $value);

// Wird NICHT unterstützt
function_name($variableStoringParamName$value);
?>

Beispiel #16 Positionsparameter im Vergleich zu benannten Parametern

<?php
// Verwendung von Positionsparametern:
array_fill(010050);

// Verwendung von benannten Parametern:
array_fill(start_index0count100value50);
?>

Die Reihenfolge, in der die benannten Parameter übergeben werden, spielt keine Rolle.

Beispiel #17 Das gleiche Beispiel wie oben mit einer anderen Reihenfolge der Parameter

<?php
array_fill
(value50count100start_index0);
?>

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 #18 Kombinieren von benannten Parametern mit Positionsparametern

<?php
htmlspecialchars
($stringdouble_encodefalse);
// Ist das Gleiche wie
htmlspecialchars($stringENT_QUOTES ENT_SUBSTITUTE ENT_HTML401'UTF-8'false);
?>

Die mehrfache Übergabe desselben Parameters führt zu einer Error-Exception.

Beispiel #19 Die mehrfache Übergabe desselben Parameters erzeugt einen Fehler

<?php
function foo($param) { ... }

foo(param1param2);
// Error: Named parameter $param overwrites previous argument
foo(1param2);
// 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. Bereits entpackte Parameter dürfen nicht durch einen benannten Parameter überschrieben werden.

Beispiel #20 Verwendung benannter Parameter nach dem Entpacken

<?php
function foo($a$b$c 3$d 4) {
  return 
$a $b $c $d;
}

var_dump(foo(...[12], d40)); // 46
var_dump(foo(...['b' => 2'a' => 1], d40)); // 46

var_dump(foo(...[12], b20)); // Fataler Fehler. Der benannte Parameter $b überschreibt den vorherige Parameter
?>

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe
Es sind noch keine Kommentare vorhanden.

DeepL Erweiterung Write als beta veröffentlicht

DeepL hat eine neuen Dienst Namens „write“ veröffentlicht, der die Rechtschreibung und Grammatik mit KI verbessern soll. ...

admin

Autor : admin
Kategorie: Dies und Das

PHPStan unterstützt PHP 8.2

PHPStan ist ein statischer Code-Analyse-Werkzeug für PHP und unterstützt jetzt PHP bis zu Version 8.2 ...

admin

Autor : admin
Kategorie: Software-Updates

xt:Commerce 6.5 für PHP 8.1 und neuem PayPal Checkout

Die Open Source Online-Shop Software xt:Commerce unterstützt in der Version 6.5 jetzt auch PHP 8.1. und stellt den Support für PHP 7.4 ein. ...

TheMax

Autor : TheMax
Kategorie: Software-Updates

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen

Script führt Update aller Spalten aus anstatt nur der gewählten

Vielen lieben Dank. Das Script arbeitet jetzt perfekt. Wollte mich auch noch für all die Tipps bedanken. Habe auf POST umgestellt und übergebe d ...

Geschrieben von MattOhl am 28.01.2023 13:46:35
Forum: SQL / Datenbanken
Neuer Podcast zur Webentwicklung

Hallo zusammen, ich komme selbst aus der Webentwicklung und hatte früher den beliebtesten deutschsprachigen PHP-Blog (www.phphatesme.com). Jetzt ...

Geschrieben von SDDC am 28.01.2023 07:20:39
Forum: News / Kostenloses
Script führt Update aller Spalten aus anstatt nur der gewählten

Du brauchst gar keine Schleife beim Speichern. Wieso auch?

Geschrieben von jonas3344 am 27.01.2023 18:16:50
Forum: SQL / Datenbanken
Script führt Update aller Spalten aus anstatt nur der gewählten

Vielen Dank für Antwort. Ich bin jetzt etwas ratlos, wie ich das abändern kann, kannst Du mir eventuell ein Beispiel geben, denn while klappt es ...

Geschrieben von MattOhl am 27.01.2023 14:52:29
Forum: SQL / Datenbanken