PHP
Funktionen
Suche…
Syntax
- Funktion func_name ($ parameterName1, $ parameterName2) {code_to_run (); }
- Funktion func_name ($ optionalParameter = Standardwert) {code_to_run (); }
- Funktion func_name (typname $ parameterName) {code_to_run (); }
- Funktion & Returns_by_reference () {code_to_run (); }
- Funktion func_name (& $ referenceParameter) {code_to_run (); }
- Funktion func_name (... $ variadicParameters) {code_to_run (); } // PHP 5.6+
- Funktion func_name (Typname & ... $ varRefParams) {code_to_run (); } // PHP 5.6+
- Funktion func_name (): return_type {code_To_run (); } // PHP 7.0+
Grundlegende Funktionsverwendung
Eine Basisfunktion wird wie folgt definiert und ausgeführt:
function hello($name)
{
print "Hello $name";
}
hello("Alice");
Optionale Parameter
Funktionen können optionale Parameter enthalten, zum Beispiel:
function hello($name, $style = 'Formal')
{
switch ($style) {
case 'Formal':
print "Good Day $name";
break;
case 'Informal':
print "Hi $name";
break;
case 'Australian':
print "G'day $name";
break;
default:
print "Hello $name";
break;
}
}
hello('Alice');
// Good Day Alice
hello('Alice', 'Australian');
// G'day Alice
Argumente als Referenz übergeben
Funktionsargumente können "Nach Referenz" übergeben werden, sodass die Funktion die außerhalb der Funktion verwendete Variable ändern kann:
function pluralize(&$word)
{
if (substr($word, -1) == 'y') {
$word = substr($word, 0, -1) . 'ies';
} else {
$word .= 's';
}
}
$word = 'Bannana';
pluralize($word);
print $word;
// Bannanas
Objektargumente werden immer als Referenz übergeben:
function addOneDay($date)
{
$date->modify('+1 day');
}
$date = new DateTime('2014-02-28');
addOneDay($date);
print $date->format('Y-m-d');
// 2014-03-01
Um das implizite Übergeben eines Objekts als Referenz zu vermeiden, sollten Sie das Objekt clone
.
Das Übergeben als Referenz kann auch als alternative Methode zur Rückgabe von Parametern verwendet werden. Zum Beispiel die Funktion socket_getpeername
:
bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )
Diese Methode zielt tatsächlich darauf ab, die Adresse und den Port des Peers zurückzugeben. Da jedoch zwei Werte zurückzugeben sind, werden stattdessen Referenzparameter verwendet. Es kann so aufgerufen werden:
if(!socket_getpeername($socket, $address, $port)) {
throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";
Die Variablen $address
und $port
müssen nicht zuvor definiert werden. Sie werden:
- zuerst als
null
definiert werden, - dann mit dem vordefinierten
null
an die Funktion übergeben - dann in der Funktion geändert
- am Ende als Adresse und Port im aufrufenden Kontext definiert.
Argumentlisten mit variabler Länge
In PHP 5.6 wurden Argumentlisten mit variabler Länge (aka varargs, variadic arguments) eingeführt. Das Token ...
vor dem Argumentnamen wurde verwendet, um anzuzeigen, dass der Parameter variadisch ist, dh es handelt sich um ein Array, das alle von diesem Parameter an angegebenen Parameter enthält.
function variadic_func($nonVariadic, ...$variadic) {
echo json_encode($variadic);
}
variadic_func(1, 2, 3, 4); // prints [2,3,4]
Typnamen können vor dem ...
hinzugefügt werden:
function foo(Bar ...$bars) {}
Der Operator &
reference kann vor dem ...
hinzugefügt werden, jedoch nach dem Typnamen (falls vorhanden). Betrachten Sie dieses Beispiel:
class Foo{}
function a(Foo &...$foos){
$i = 0;
foreach($a as &$foo){ // note the &
$foo = $i++;
}
}
$a = new Foo;
$c = new Foo;
$b =& $c;
a($a, $b);
var_dump($a, $b, $c);
Ausgabe:
int(0)
int(1)
int(1)
Auf der anderen Seite wird ein Array (oder Traversable
) des Arguments kann in Form einer Parameterliste an eine Funktion übergeben wird ausgepackt werden:
var_dump(...hash_algos());
Ausgabe:
string(3) "md2"
string(3) "md4"
string(3) "md5"
...
Vergleichen Sie mit diesem Ausschnitt ohne Verwendung von ...
:
var_dump(hash_algos());
Ausgabe:
array(46) {
[0]=>
string(3) "md2"
[1]=>
string(3) "md4"
...
}
Daher können Weiterleitungsfunktionen für verschiedene Funktionen jetzt einfach erstellt werden, zum Beispiel:
public function formatQuery($query, ...$args){
return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}
Neben Arrays können auch Traversable
s wie Iterator
(insbesondere viele seiner Unterklassen von SPL) verwendet werden. Zum Beispiel:
$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304
Wenn der Iterator unendlich oft wiederholt wird:
$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);
Verschiedene PHP-Versionen verhalten sich unterschiedlich:
- Von PHP 7.0.0 bis PHP 7.1.0 (Beta 1):
- Ein Segmentierungsfehler wird auftreten
- Der PHP-Prozess wird mit Code 139 beendet
- In PHP 5.6:
- Ein schwerwiegender Fehler der Speicherbelegung ("zulässige Speichergröße von% d Byte erschöpft") wird angezeigt.
- Der PHP-Prozess wird mit Code 255 beendet
Hinweis: HHVM (v3.10 - v3.12) unterstützt das Auspacken von
Traversable
s nicht. Bei diesem Versuch wird die Warnmeldung "Nur Container dürfen ausgepackt werden" angezeigt.
Funktionsumfang
Variablen innerhalb von Funktionen befinden sich in einem lokalen Bereich wie diesem
$number = 5
function foo(){
$number = 10
return $number
}
foo(); //Will print 10 because text defined inside function is a local variable