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ą:

  1. najpierw należy zdefiniować jako null ,
  2. następnie przekazano do funkcji z predefiniowaną wartością null
  3. następnie zmodyfikowane w funkcji
  4. kończy się jako adres i port w kontekście wywoływania.

Listy argumentów o zmiennej długości

5.6

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow