PHP 5.6 awesomeness!

Read this post in English

Share on:

Nici nu a inceput bine anul si o noua versiune de PHP se pregateste de lansare. La data cand scriu acest blog, este in alpha 2. Se poate descarca de aici: snaps.php.net.

Sunt o serie de imbunatatiri interesante, dar astazi voi vorbi doar despre 3 dintre ele: constant scalar expressions, variadic functions si arguments unpacking.

Constant scalar expressions

Aceasta prima imbunatatire este si singura care nu avea un echivalent inainte de aceasta versiune. Iar, cand spun un echivalent, ma refer doar la clase.

Pana acum, constantele definite folosind cuvantul cheie “const” nu permiteau nici un fel de expresie, se putea folosi doar o valoare scalara, ex:

1const INT_CONST = 1;
2
3const STRING_CONST = "string";
4
5const HEREDOC_CONST = <<<'EOT'
6nowdoc
7EOT;

Evident, mai este si varianta mai interesanta, care permite setarea de constante cu valori dinamice:

1define('DYN_CONST', $variable);

Partea proasta este ca acest tip de constanta nu se poate defini pentru o clasa, deoarece pentru aceasta operatiune se poate folosi doar const.

Acum insa se poate folosi:

1const ONE = 1;
2const TWO = ONE * 2;
3const STR = "string of one and two :" . ONE . TWO;

Si, daca asta nu este suficient, exista varianta:

1define('FLAG', true);
2
3const EXP = FLAG ? ONE : TWO;

Practic poti seta dinamic valori  pentru o constanta a unei clase! De exemplu, poti seta direct intr-o astfel de constanta tipul de mediu in care se afla utilizatorul, dev sau prod.

Variadic functions

Aceasta este imbunatatirea care imi place cel mai mult, desi are si un echivalent in versiunile mai vechi.

In prezent, daca vrei sa ai o functie cu un numar variabil de parametri, poti face:

 1function variableParameters () {
 2     $params = func_get_args();
 3     foreach ($params as $parameter) {
 4          echo $parameter . PHP_EOL;
 5     }
 6}
 7
 8variableParameters(1);
 9variableParameters(1, 2);
10variableParameters(1, 2, 3);

Sunt cateva probleme, mai mult sau mai putin evidente, la o astfel de abordare:

  1. Din semnatura functiei nu este clar ca accepta mai multi parametri, dimpotriva, pare ca nu accepta nici un parametru;
  2. func_get_args poate sa fie apelata oriunde in functie. Daca este pe prima linie, o sa fie evident scopul; daca este pe linia 20 din functie, o sa fie greu de reperat si va genera confuzie.

O alternativa este sa punem un numar de parametri, dar nici asta nu o sa evidentieze comportamentul variabil.

Aici intervine noua abordare:

1function variableParameters (...$params) {
2     foreach ($params as $parameter) {
3          echo $parameter . PHP_EOL;
4     }
5}

In aceasta noua varianta, este evident ce se intampla cu parametrii functiei. Nu trebuie sa intelegi daca si cati parametri primeste functia, este clar ca acestia au un numar variabil!

In general, cand caut o functie, eu ma uit la definitia ei in IDE inainte sa ma uit la documentatia ei, mai ales ca documentatia de multe ori nici nu exista.

Arguments unpacking

Problema care incearca sa fie rezolvata in acest mod este: ai o functie cu parametri multiplii, iar acestia trebuie trimisi in mod dinamic.

Cum spuneam si mai sus, exista moduri alternative de a rezolva aceasta problema. Sa luam functia din exemplul trecut:

1function variableParameters () {
2     $params = func_get_args();
3     foreach ($params as $parameter) {
4          echo $parameter . PHP_EOL;
5     }
6}

Si acum sa zicem ca este un numar variabil de parametri, iar acestia sunt stocati intr-un array. Ca sa-i pasam nu avem foarte multe solutii:

1$params = ['param1', 'param2', 'param3'];
2
3call_user_func_array("variableParameters", $params);

Rezultatul va fi:

1param1
2param2
3param3

In PHP 5.6 vom putea folosi cele 3 puncte, similar cu exemplul de la “Variadic functions”, doar ca aplicati invers. In loc de parametrii pe care ii primeste functia, sunt parametrii care se trimit catre aceasta:

1variadicParameters(...$params);

Poate pentru un exemplu de acest fel nu este clar, dar sa zicem ca este un numar fix de parametri pentru functie:

1function twoParams($a, $b) {
2     echo $a . $b . PHP_EOL;
3}
4
5$params = ["Hello", "PHP 5.6!"];
6
7twoParams(...$params);

Chiar daca nu este ceva ce nu se putea face in versiunile anterioare, acum este mult mai elegant.

Iar, ca sa concluzionam, cele doua exemple:

1function variableParameters (...$params) {
2     foreach ($params as $parameter) {
3          echo $parameter . PHP_EOL;
4     }
5}
6
7variableParamerers(...["cool", "parameter", "unpacking"]);

Cred ca prin aceste mici schimbari de nuanta, PHP face tranzitia de la “the PHP way”, la “the best way”, preluand din alte limbaje.