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\n\3\n
Pevný počet argumentů předaný z pole
function sum3($a, $b, $c) {
return $a + $b + $c;
}
$values = [1, 2, 3];
echo sum3(...$values) . "\n"; // 6
Vý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 = 3
Named 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 32
Deklarace 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)
- vrácí 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;
}
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)
- local (výchozí)
global
static
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