Funkce
Funkce
- název funkce
[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*- unikátní, case-insensitive
- funkci nelze předefinovat (→
require_once(),include_once())
Funkce
- argumenty předávané
- hodnotou (výchozí)
- referencí (explicitně,
&)
- možnost proměnlivého počtu argumentů
func_get_args()- argument unpacking
...$variable
Proměnlivý počet argumentů
function printValues(...$values)
{
foreach($values as $value)
echo "$value\n";
}
printValues(1, 2, 3); // 1\n2\n3\nPevný počet argumentů předaný z pole
function sum3($a, $b, $c) {
return $a + $b + $c;
}
$values = [1, 2, 3];
echo sum3(...$values) . "\n"; // 6Výchozí hodnoty argumentů
- jednoduché typy, pole
- argument s výchozí hodnotou mohou následovat jen další argumenty s výchozí hodnotou
function defaults($a, $b = 1, $c = [1, 2]){
// ...
}
defaults(1); // $b = 1, $c = [1, 2]
defaults(1, 2); // $b = 2, $c = [1, 2]
defaults(1, 2, 3); // $b = 2, $c = 3Named argumenty (PHP 8)
- Rozšiřitelnosti kódu může pomoci argumenty pojmenovávat (jinak lze argument bezpečně přidat jen na konec)
- https://www.php.net/manual/en/functions.arguments.php#functions.named-arguments
function mocnina($zaklad, $exponent) {
return $zaklad ** $exponent;
}
mocnina(zaklad: 2, exponent: 5); // vrati 32
// prohodit parametry lze, ale smeruje to k mene prehlednemu kodu
mocnina(exponent: 5, zaklad: 2); // rovnez vrati 32Deklarace typu argumentů
- Type hinting
- interpreter kontroluje zda je argument zadaného typu
- jinak způsobí TypeError
- třídy, interface, pole, callable (PHP5)
- jednoduché typy (od PHP7)
- union typy (od PHP8)
- intersection typy (od PHP 8.1)
- DNF typy (od PHP 8.2)
Deklarace typu argumentů
function printDate(DateTime $dateTime = NULL) {
if (! $dateTime) {
$dateTime = new DateTime();
}
echo "Timestamp: " . $dateTime->getTimestamp() . "\n";
}
printDate();Návratová hodnota
- jedna hodnota (nebo pole)
- vrací se hodnotou (jednoduché typy, pole) nebo odkazem (objekty)
- definování typu návratové hodnoty (od PHP7)
- interpreter kontroluje zda je hodnota zadaného typu
- nebo
null- před typem je?
Návratová hodnota
function divide(float $a, float $b): ?float {
if($b == 0) {
return null; // ?float
}
return $a / $b;
}Návrat referencí
- funkce může vrátit referenci na proměnnou místo kopie hodnoty (
&před názvem funkce) - volající musí referenci převzít také pomocí
&, jinak dostane kopii - používá se zřídka (např. přístup k vnitřnímu poli objektu), obvykle je vhodnější vrátit objekt
function hodnota() {
static $arr = [1, 2];
return $arr;
}
function &reference() {
static $arr = [1, 2];
return $arr;
}
$a = hodnota();
$b = &reference();
$a[] = 3; $b[] = 4;
$a = hodnota(); // [1, 2] - statické pole se nezměnilo, pracovali jsme s kopií
$b = &reference(); // [1, 2, 4] - statické pole se změnilo, pracovali jsme s referencíVíce návratových hodnot
pomocí pole
function f($a, $b) { return [ $a+$b, $a-$b ]; } list($sum, $diff) = f(10, 7); [$sum, $diff] = f(10, 7);pomocí objektu
function f($a, $b) { return (object) [ $a+$b, $a-$b ]; }- Více ve cvičení 3 o této "nádheře"
Kontext (variable scope)
Proměnné jsou viditelné pouze v kontextu, ve kterém byly definovány.
- local (výchozí) - tělo funkce je samostatný kontext
global- zpřístupní proměnnou z globálního kontextustatic- hodnota přežije mezi voláními funkce- superglobální pole (
$_GET,$_POST, …) jsou dostupná všude
Kontext - lokální proměnné
Globální proměnná není uvnitř funkce vidět. $p uvnitř f() je nová, lokální proměnná.
$p = "globalni promenna";
function f() {
echo "$p"; // Warning: Undefined variable $p
$p = "lokalni promenna";
echo "$p"; // lokalni promenna
}
f();
echo "$p"; // globalni promennaKontext - global
$p = "globalni promenna";
function f() {
global $p;
echo "$p"; // globalni promenna
}
f();- alternativně
$GLOBALS['p'] - globální proměnné ztěžují testování a čtení kódu, předávejte hodnoty raději argumenty
Kontext - static
function f() {
static $p = 0;
$p++;
echo $p;
}
f(); f(); f(); // 123- inicializace proběhne jen při prvním volání
Proměnné funkce
- jméno funkce je uložené v proměnné
- volání připojením
()za název, samozřejmě i včetně argumentů
function func() {
echo "func()\n";
}
$f = 'func';
$f();Anonymní funkce
first-class object (lze přiřadit)
$func = function($arg) { ... }; $func(10); $other = $func; $other(11);
Anonymní funkce
často používaná jako callback
$array = [2, 4, 3, 1]; usort($array, function($a, $b) { if ($a < $b) return -1; if ($a > $b) return 1; return 0; }); print_r($array);
Anonymní funkce
Closure - funkce + kontext
function adder($base) { return function($increment) use ($base) { return $base + $increment; }; } $adder5 = adder(5); echo $adder5(10) . "\n"; //15
Arrow funkce
Arrow funkce - PHP 7.4, podobná lambda funkcím z c++, automaticky přejímá všechen kontext
$array = [2, 4, 3, 1]; usort($array, fn ($a, $b) => $a - $b); print_r($array);
Funkce ve funkci
- v globalním kontextu
- nelze zavolat dřív než je zavolána vnější
function outer() {
function inner() {
echo "Inner function\n";
}
}
outer();
// MUST be called after outer() is called
inner();Jazykové konstrukty
TOTO NEJSOU FUNKCE!!!
echo,print,unset(),isset(),empty(),include,require