PHP
functies
Zoeken…
Syntaxis
- functie func_name ($ parameterName1, $ parameterName2) {code_to_run (); }
- functie func_name ($ optioneelParameter = default_value) {code_to_run (); }
- functie func_name (type_name $ parameterName) {code_to_run (); }
- function & Returns_by_reference () {code_to_run (); }
- functie func_name (& $ referenceParameter) {code_to_run (); }
- functie func_name (... $ variadicParameters) {code_to_run (); } // PHP 5.6+
- functie func_name (type_name & ... $ varRefParams) {code_to_run (); } // PHP 5.6+
- functie func_name (): return_type {code_To_run (); } // PHP 7.0+
Gebruik van basisfuncties
Een basisfunctie wordt als volgt gedefinieerd en uitgevoerd:
function hello($name)
{
print "Hello $name";
}
hello("Alice");
Optionele parameters
Functies kunnen optionele parameters hebben, bijvoorbeeld:
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
Argumenten doorgeven via referentie
Functieargumenten kunnen "op referentie" worden doorgegeven, zodat de functie de variabele kan wijzigen die buiten de functie wordt gebruikt:
function pluralize(&$word)
{
if (substr($word, -1) == 'y') {
$word = substr($word, 0, -1) . 'ies';
} else {
$word .= 's';
}
}
$word = 'Bannana';
pluralize($word);
print $word;
// Bannanas
Objectargumenten worden altijd doorgegeven als referentie:
function addOneDay($date)
{
$date->modify('+1 day');
}
$date = new DateTime('2014-02-28');
addOneDay($date);
print $date->format('Y-m-d');
// 2014-03-01
Om te voorkomen dat een object impliciet wordt doorgegeven, moet u het object clone
.
Passing by reference kan ook worden gebruikt als een alternatieve manier om parameters te retourneren. Bijvoorbeeld de functie socket_getpeername
:
bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )
Deze methode is eigenlijk bedoeld om het adres en de poort van de peer te retourneren, maar omdat er twee waarden zijn om te retourneren, kiest het ervoor om in plaats daarvan referentieparameters te gebruiken. Het kan zo worden genoemd:
if(!socket_getpeername($socket, $address, $port)) {
throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";
De variabelen $address
en $port
hoeven niet eerder te worden gedefinieerd. Ze zullen:
- eerst worden gedefinieerd als
null
, - vervolgens doorgegeven aan de functie met de vooraf gedefinieerde
null
- vervolgens gewijzigd in de functie
- uiteindelijk gedefinieerd als het adres en de poort in de aanroepende context.
Variabele lengte argumentlijsten
PHP 5.6 introduceerde variabele-lengte argumentlijsten (ook bekend als varargs, variadische argumenten), met behulp van het ...
token voor de argumentnaam om aan te geven dat de parameter variadisch is, dat wil zeggen het is een array met alle geleverde parameters vanaf dat moment.
function variadic_func($nonVariadic, ...$variadic) {
echo json_encode($variadic);
}
variadic_func(1, 2, 3, 4); // prints [2,3,4]
Typenamen kunnen worden toegevoegd vóór de ...
:
function foo(Bar ...$bars) {}
De operator &
reference kan worden toegevoegd vóór ...
, maar na de typenaam (indien aanwezig). Beschouw dit voorbeeld:
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);
Output:
int(0)
int(1)
int(1)
Aan de andere kant kan een array (of Traversable
) van argumenten worden uitgepakt om te worden doorgegeven aan een functie in de vorm van een lijst met argumenten:
var_dump(...hash_algos());
Output:
string(3) "md2"
string(3) "md4"
string(3) "md5"
...
Vergelijk met dit fragment zonder gebruik van ...
:
var_dump(hash_algos());
Output:
array(46) {
[0]=>
string(3) "md2"
[1]=>
string(3) "md4"
...
}
Daarom kunnen omleidingsfuncties voor variadische functies nu eenvoudig worden gemaakt, bijvoorbeeld:
public function formatQuery($query, ...$args){
return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}
Afgezien van arrays, kunnen Traversable
s, zoals Iterator
(vooral veel van de subklassen van SPL) ook worden gebruikt. Bijvoorbeeld:
$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304
Als de iterator oneindig itereert, bijvoorbeeld:
$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);
Verschillende versies van PHP gedragen zich anders:
- Van PHP 7.0.0 tot PHP 7.1.0 (beta 1):
- Er treedt een segmentatiefout op
- Het PHP-proces wordt afgesloten met code 139
- In PHP 5.6:
- Een fatale fout van geheugenuitputting ("Toegestane geheugengrootte van% d bytes uitgeput") wordt weergegeven.
- Het PHP-proces wordt afgesloten met code 255
Opmerking: HHVM (v3.10 - v3.12) biedt geen ondersteuning voor het uitpakken van
Traversable
s. Een waarschuwing "Alleen containers mogen worden uitgepakt" zal bij deze poging worden getoond.
Functiebereik
Variabelen binnen functies bevinden zich binnen een lokaal bereik zoals dit
$number = 5
function foo(){
$number = 10
return $number
}
foo(); //Will print 10 because text defined inside function is a local variable