PHP
Funkcje
Szukaj…
Składnia
- funkcja nazwa_funkcji ($ nazwa_parametru1, $ nazwa_parametru2) {code_to_run (); }
- funkcja nazwa_funkcji ($ opcjonalnaParametr = wartość domyślna) {code_to_run (); }
- funkcja nazwa_funkcji (nazwa_typu $ nazwa_parametru) {code_to_run (); }
- function & return_by_reference () {code_to_run (); }
- funkcja func_name (& $ referenceParameter) {code_to_run (); }
- funkcja func_name (... $ variadicParameters) {code_to_run (); } // PHP 5.6+
- funkcja nazwa_funkcji (nazwa_typu i ... $ varRefParams) {code_to_run (); } // PHP 5.6+
- funkcja func_name (): return_type {code_To_run (); } // PHP 7.0+
Podstawowe użycie funkcji
Podstawowa funkcja jest zdefiniowana i wykonana w następujący sposób:
function hello($name)
{
print "Hello $name";
}
hello("Alice");
Parametry opcjonalne
Funkcje mogą mieć parametry opcjonalne, na przykład:
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
Przekazywanie argumentów przez referencję
Argumenty funkcji mogą być przekazywane „przez odniesienie”, umożliwiając funkcji modyfikowanie zmiennej używanej poza funkcją:
function pluralize(&$word)
{
if (substr($word, -1) == 'y') {
$word = substr($word, 0, -1) . 'ies';
} else {
$word .= 's';
}
}
$word = 'Bannana';
pluralize($word);
print $word;
// Bannanas
Argumenty obiektowe są zawsze przekazywane przez odwołanie:
function addOneDay($date)
{
$date->modify('+1 day');
}
$date = new DateTime('2014-02-28');
addOneDay($date);
print $date->format('Y-m-d');
// 2014-03-01
Aby uniknąć niejawnego przekazywania obiektu przez referencję, należy go clone
.
Przekazywanie przez referencję można również wykorzystać jako alternatywny sposób zwracania parametrów. Na przykład funkcja socket_getpeername
:
bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )
Ta metoda faktycznie ma zwrócić adres i port peera, ale ponieważ są dwie wartości do zwrócenia, zamiast tego wybiera użycie parametrów referencyjnych. Można to nazwać tak:
if(!socket_getpeername($socket, $address, $port)) {
throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";
Zmienne $address
i $port
nie muszą być wcześniej zdefiniowane. Oni będą:
- najpierw należy zdefiniować jako
null
, - następnie przekazano do funkcji z predefiniowaną wartością
null
- następnie zmodyfikowane w funkcji
- kończy się jako adres i port w kontekście wywoływania.
Listy argumentów o zmiennej długości
PHP 5.6 wprowadził listy argumentów o zmiennej długości (aka varargs, argumenty variadic), używając tokena ...
przed nazwą argumentu, aby wskazać, że parametr jest variadic, tzn. Jest to tablica zawierająca wszystkie dostarczone parametry od tego samego.
function variadic_func($nonVariadic, ...$variadic) {
echo json_encode($variadic);
}
variadic_func(1, 2, 3, 4); // prints [2,3,4]
Nazwy typów można dodać przed ...
:
function foo(Bar ...$bars) {}
Operator &
referencję można dodać przed ...
, ale po nazwie typu (jeśli istnieje). Rozważ ten przykład:
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);
Wynik:
int(0)
int(1)
int(1)
Z drugiej strony, tablica (lub Traversable
) argumentów może być rozpakowana i przekazana do funkcji w formie listy argumentów:
var_dump(...hash_algos());
Wynik:
string(3) "md2"
string(3) "md4"
string(3) "md5"
...
Porównaj z tym fragmentem bez użycia ...
:
var_dump(hash_algos());
Wynik:
array(46) {
[0]=>
string(3) "md2"
[1]=>
string(3) "md4"
...
}
W związku z tym można teraz łatwo tworzyć funkcje przekierowujące dla funkcji variadic, na przykład:
public function formatQuery($query, ...$args){
return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}
Oprócz tablic, Traversable
S, taki jak Iterator
(w szczególności wiele z ich podklas z SPL) mogą również być stosowane. Na przykład:
$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304
Jeśli iterator iteruje w nieskończoność, na przykład:
$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);
Różne wersje PHP zachowują się inaczej:
- Od PHP 7.0.0 do PHP 7.1.0 (beta 1):
- Wystąpi błąd segmentacji
- Proces PHP zakończy się z kodem 139
- W PHP 5.6:
- Wyświetlany jest błąd krytyczny wyczerpania pamięci („Dozwolony rozmiar pamięci% d bajtów wyczerpanych”).
- Proces PHP zakończy się z kodem 255
Uwaga: HHVM (v3.10 - v3.12) nie obsługuje rozpakowywania
Traversable
s. Podczas tej próby zostanie wyświetlony komunikat ostrzegawczy „Tylko pojemniki mogą być rozpakowane”.
Zakres funkcji
Zmienne wewnątrz funkcji znajdują się w zasięgu lokalnym, takim jak ten
$number = 5
function foo(){
$number = 10
return $number
}
foo(); //Will print 10 because text defined inside function is a local variable