Funkcję w PHP definiuje się słowem kluczowym function, nazwą, listą parametrów i treścią; return odsyła wartość do wywołującego. function add(int $a, int $b): int { return $a + $b; } ją definiuje, a add(2, 3) wywołuje i zwraca 5.
string i int przed parametrami to deklaracje typów, a : string po nawiasach to typ zwracany. Oba są opcjonalne, ale wcześnie wyłapują błędy i dokumentują, czego funkcja oczekuje.
Wartości zwracane i zwracanie kilku wartości
return natychmiast kończy funkcję. Funkcja bez return albo z samym return; zwraca null; zadeklaruj : void, gdy wywołujesz ją tylko dla jej efektu. Funkcja zwraca jedną wartość, ale ta wartość może być tablicą, którą destrukturyzujesz po stronie wywołania:
Inne formy [...] = opisuje strona o destrukturyzacji tablic.
Parametry domyślne i argumenty nazwane
Parametr z = value jest opcjonalny: wywołujący może go pominąć. Parametry opcjonalne idą po wymaganych. Od PHP 8.0 argumenty nazwane pozwalają przekazać dowolny parametr po nazwie, więc możesz pominąć te opcjonalne, których nie potrzebujesz.
Argumenty nazwane poprawiają też czytelność wywołań funkcji wbudowanych: str_pad('7', 3, '0', pad_type: STR_PAD_LEFT). Nazwa parametru staje się częścią publicznego interfejsu funkcji, więc zmiana nazwy parametru może zepsuć wywołania, które używają nazw.
Przekazywanie przez referencję
Zwykle PHP przekazuje kopię każdego argumentu, więc funkcja nie może zmienić zmiennej wywołującego. & przed parametrem przekazuje samą zmienną. Tak działają funkcje wbudowane, takie jak sort().
Zwrócenie nowej wartości jest zwykle czytelniejsze niż zmiana argumentu. Używaj referencji, gdy funkcja naprawdę ma coś zmodyfikować w miejscu.
Deklaracje typów i strict_types
Domyślnie PHP konwertuje argumenty na zadeklarowany typ, gdy to możliwe: add("5", 3) zamienia "5" w 5. Umieszczenie declare(strict_types=1); na samej górze pliku wyłącza to dla wywołań w tym pliku, więc zły typ rzuca TypeError zamiast zostać skonwertowany.
Bez linii declare to samo wywołanie wypisuje 8. Stringi, które nie są liczbami, takie jak "five", rzucają TypeError w obu trybach.
Typy, które możesz deklarować dla parametrów i wartości zwracanych:
never to typ zwracany dla funkcji, które zawsze rzucają wyjątek albo kończą skrypt. Nazwy klas i interfejsów też działają jako typy.
Zmienna liczba argumentów przez ...$args
...$numbers zbiera dowolną liczbę argumentów w tablicę. To samo ... po stronie wywołania rozpakowuje tablicę na osobne argumenty.
Zmienna z zewnątrz wewnątrz funkcji
Funkcja ma własny zasięg. Zmienna zdefiniowana poza nią nie jest widoczna w środku, co zaskakuje osoby przychodzące z JavaScriptu:
<?php
$taxRate = 0.2;
function priceWithTax(float $price): float
{
return $price * (1 + $taxRate); // $taxRate is undefined here
}
Warning: Undefined variable $taxRate in /path/to/index.php on line 6
a funkcja zwraca cenę bez podatku. Zamiast tego przekaż wartość jako parametr. Dzięki temu funkcja uczciwie pokazuje, od czego zależy, i łatwo ją testować:
Słowo kluczowe global też działa, ale ukrywa zależność; opisuje je strona o zasięgu zmiennych. Dla krótkich funkcji przekazywanych do innych funkcji, takich jak callbacki dla array_map(), zobacz funkcje anonimowe, które mogą przechwytywać zmienne z zewnątrz przez use.
Najczęściej zadawane pytania
Jak zdefiniować funkcję w PHP?
Użyj słowa kluczowego function, nazwy, parametrów w nawiasach i treści: function add(int $a, int $b): int { return $a + $b; }. Wywołaj ją jako add(2, 3). Nazwy funkcji nie rozróżniają wielkości liter, a funkcję zdefiniowaną na najwyższym poziomie pliku można wywołać przed linią, która ją definiuje.
Jak zwrócić kilka wartości z funkcji w PHP?
Zwróć tablicę i ją zdestrukturyzuj: function minMax(array $a): array { return [min($a), max($a)]; }, a potem [$min, $max] = minMax([3, 1, 4]);. Dla nazwanych wyników zwróć tablicę asocjacyjną i użyj ['min' => $min] = ....
Co robi declare(strict_types=1)?
Wyłącza automatyczną konwersję typów dla wywołań z tego pliku, więc przekazanie "5" do parametru int rzuca TypeError zamiast zamienić je na 5. Musi to być pierwsza instrukcja w pliku i dotyczy tylko tego pliku.
Czym są argumenty nazwane w PHP?
Od PHP 8.0 możesz przekazywać argumenty po nazwie parametru: htmlspecialchars($s, double_encode: false). Można je podawać w dowolnej kolejności po argumentach pozycyjnych i pozwalają pominąć parametry opcjonalne, których nie chcesz zmieniać.
Jak przekazać zmienną przez referencję w PHP?
Postaw & przed parametrem: function addOne(int &$n): void { $n++; }. Funkcja zmienia wtedy zmienną wywołującego. Bez & PHP przekazuje kopię, a zmienna wywołującego pozostaje bez zmian.