Jdi na navigaci předmětu

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

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)

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