Co nowego w PHP 5.6: Variadic functions

Film przedstawia Variadic functions czyli funkcje ze zmienną ilością argumentów. Zarówno w podejściu klasycznym z wykorzystaniem funkcji func_get_args() jak i nowym wprowadzonym w PHP 5.6 z wykorzystaniem operatora trzech kropek.

Seria „Co nowego w PHP 5.6”

  1. Nowy operator potęgowania (**).
  2. Variadic functions – funkcje ze zmienna ilością parametrów.
  3. Argument unpacking – rozwijanie/wypakowanie argumentów.
  4. Stosowanie wyrażeń przy definiowaniu pól, parametrów i stałych.
  5. Import funkcji i stałych do przestrzeni nazw.

Dotychczasowy sposób odczytywania przekazanych parametrów odbywał się przy pomocy funkcji func_get_args().


function printme()
{
    $params = func_get_args();
    var_dump($params);
}

printme('a', 'b', 'c', 'd');
array(4) {
  [0]=>                 
  string(1) "a"
  [1]=>
  string(1) "b"      
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d" 
}

W PHP 5.6 możemy użyć operatora trzech kropek aby zapewnić identyczną funkcjonalność i pozbyć się funkcji func_get_args().


function printme(...$params)
{
    var_dump($params);
}

printme('a', 'b', 'c', 'd');

Skoro mamy stary sprawdzony sposób można się więc zastanowić po co nam nowy operator? Różnice zaczynają być widoczne kiedy funkcja ma zdefiniowane również inne parametry, które chcemy przekazywać do funkcji wprost.

function printme($x, $y)
{
    $params = func_get_args();

    echo $x, ',', $y;
    var_dump($params);
}

printme('a', 'b', 'c', 'd');
a,b
array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
}

Jak widać wartości a i b dostępne są przez zmienne $x i $y oraz występują w tablicy, którą zwróciła funkcja func_get_args() co sprawia że aby dostać się do wartości trzeciego parametru musimy pamiętać o pominięciu dwóch pierwszych. Zobaczmy jak to wygląda w PHP 5.6 z wykorzystaniem operatora trzech kropek.


function printme($x, $y, ...$params)
{
    echo $x, ',', $y;
    var_dump($params);
}

printme('a', 'b', 'c', 'd');
a,b
array(2) {
  [0]=>
  string(1) "c"
  [1]=>
  string(1) "d"
}

Widzimy, że w zmiennej $params mamy tylko wartości parametru trzeciego i czwartego.

Podpowiadanie typów

Ciekawą sprawą jest możliwość podpowiadania typów dla parametru poprzedzonego trzema kropkami. Wszystkie parametry, które mają być przekazane do zmiennej $params musza być danego typu.


class Foo{}

function printme($x, Foo ...$params)
{
    echo $x;
    var_dump($params);
}

Wywołanie funkcji z następującymi parametrami spowoduje błąd.


printme('a', 'b', 'c');

Catchable fatal error: Argument 2 passed to printme() must be an instance of Foo, string given

Natomiast wywołanie funkcji w następujący sposób da wynik taki jaki się spodziewamy czyli w zmiennej $params będziemy mieli tablicę z obiektami klasy Foo.


printme('a', new Foo, new Foo);
a
array(2) {  
  [0]=>         
  object(Foo)#1 (0) {
  }    
  [1]=>         
  object(Foo)#2 (0) {
  }
}      

W kolejnej części przedstawię zagadnienie związane z argument unpacking z wykorzystaniem operatora trzech kropek. Zapraszam niebawem.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *