Claudiu Persoiu

Blog-ul lui Claudiu Persoiu


Archive for 22 February 2014

PHP 5.6 awesomeness!

with 2 comments

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:

const INT_CONST = 1;

const STRING_CONST = "string";

const HEREDOC_CONST = <<<'EOT'
nowdoc
EOT;

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

define('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:

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

Si, daca asta nu este suficient, exista varianta:

define('FLAG', true);

const 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:

function variableParameters () {
     $params = func_get_args();
     foreach ($params as $parameter) {
          echo $parameter . PHP_EOL;
     }
}

variableParameters(1);
variableParameters(1, 2);
variableParameters(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:

function variableParameters (...$params) {
     foreach ($params as $parameter) {
          echo $parameter . PHP_EOL;
     }
}

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:

function variableParameters () {
     $params = func_get_args();
     foreach ($params as $parameter) {
          echo $parameter . PHP_EOL;
     }
}

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:

$params = ['param1', 'param2', 'param3'];

call_user_func_array("variableParameters", $params);

Rezultatul va fi:

param1
param2
param3

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:

variadicParameters(...$params);

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

function twoParams($a, $b) {
     echo $a . $b . PHP_EOL;
}

$params = ["Hello", "PHP 5.6!"];

twoParams(...$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:

function variableParameters (...$params) {
     foreach ($params as $parameter) {
          echo $parameter . PHP_EOL;
     }
}

variableParamerers(...["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.

Written by Claudiu Persoiu

22 February 2014 at 10:17 PM

Posted in PHP

Tagged with ,