PHP
funktioner
Sök…
Syntax
- funktion func_name ($ parameterName1, $ parameterName2) {code_to_run (); }
- funktion func_name ($ optionalParameter = default_value) {code_to_run (); }
- funktion func_name (typ_name $ parameternamn) {code_to_run (); }
- funktion & return_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 (typ_name & ... $ varRefParams) {code_to_run (); } // PHP 5.6+
- funktion func_name (): return_type {code_To_run (); } // PHP 7.0+
Grundläggande funktionsanvändning
En grundläggande funktion definieras och körs så här:
function hello($name)
{
print "Hello $name";
}
hello("Alice");
Valfria parametrar
Funktioner kan ha valfria parametrar, till exempel:
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
Vidarebefordra argument genom referens
Funktionsargument kan skickas "Med referens", vilket gör att funktionen kan ändra variabeln som används utanför funktionen:
function pluralize(&$word)
{
if (substr($word, -1) == 'y') {
$word = substr($word, 0, -1) . 'ies';
} else {
$word .= 's';
}
}
$word = 'Bannana';
pluralize($word);
print $word;
// Bannanas
Objektargument skickas alltid som referens:
function addOneDay($date)
{
$date->modify('+1 day');
}
$date = new DateTime('2014-02-28');
addOneDay($date);
print $date->format('Y-m-d');
// 2014-03-01
För att undvika implicit överföring av ett objekt genom referens bör du clone
objektet.
Vidarebefordran av referens kan också användas som ett alternativt sätt att returnera parametrar. Till exempel funktionen socket_getpeername
:
bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )
Denna metod syftar faktiskt till att returnera peerens adress och port, men eftersom det finns två värden att returnera väljer den att använda referensparametrar istället. Det kan kallas så här:
if(!socket_getpeername($socket, $address, $port)) {
throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";
Variablerna $address
och $port
behöver inte definieras tidigare. De kommer:
- definieras som
null
först, - överfördes sedan till funktionen med det fördefinierade
null
- ändras sedan i funktionen
- i slutändan definieras som adress och port i samtalssammanhang.
Argumentlistor med variabel längd
PHP 5.6 införde argumenteringslistor med variabel längd (aka varargs, variadic argument), med hjälp av ...
token före argumentnamnet för att indikera att parametern är variadisk, dvs.
function variadic_func($nonVariadic, ...$variadic) {
echo json_encode($variadic);
}
variadic_func(1, 2, 3, 4); // prints [2,3,4]
Typnamn kan läggas till framför ...
:
function foo(Bar ...$bars) {}
&
Referensoperatören kan läggas till före ...
, men efter typnamnet (i förekommande fall). Tänk på detta exempel:
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);
Produktion:
int(0)
int(1)
int(1)
Å andra sidan kan en matris (eller Traversable
) av argument packas upp för att skickas till en funktion i form av en argumentlista:
var_dump(...hash_algos());
Produktion:
string(3) "md2"
string(3) "md4"
string(3) "md5"
...
Jämför med detta utdrag utan att använda ...
:
var_dump(hash_algos());
Produktion:
array(46) {
[0]=>
string(3) "md2"
[1]=>
string(3) "md4"
...
}
Därför kan omdirigeringsfunktioner för variadiska funktioner nu enkelt göras, till exempel:
public function formatQuery($query, ...$args){
return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}
Förutom matriser kan också Traversable
s, som Iterator
(särskilt många av dess underklasser från SPL) användas. Till exempel:
$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304
Om iteratorn upprepas oändligt, till exempel:
$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);
Olika versioner av PHP beter sig annorlunda:
- Från PHP 7.0.0 upp till PHP 7.1.0 (beta 1):
- Ett segmenteringsfel kommer att inträffa
- PHP-processen avslutas med kod 139
- I PHP 5.6:
- Ett dödligt fel med utmattning av minnet ("Tillåtet minnesstorlek på% d byte uttömt") kommer att visas.
- PHP-processen kommer att avsluta med kod 255
Obs: HHVM (v3.10 - v3.12) stöder inte packning av
Traversable
s. I detta försök visas ett varningsmeddelande "Endast behållare får packas upp".
Funktionsområde
Variabler inuti funktioner finns inom ett lokalt omfång som detta
$number = 5
function foo(){
$number = 10
return $number
}
foo(); //Will print 10 because text defined inside function is a local variable