Ce vine nou în PHP 5.5

finally

Cuvântul cheie finally completează constructul try .. catch ... Acesta marchează instrucțiunile ce vor fi urmate indiferent dacă vor fi prinse excepții sau nu. Perfect pentru situații când vrei să manipulezi rezultatul constructului try .. catch, procesând codul neriscant in blocul finally. O altă utilizarea ar fi procesul de curățare a codului, spre exemplu, asigurând că nu încerci să închizi același stream de mai multe ori.

list în foreach

Construcția list există încă din PHP4, dar nu era posibil să fie folosită într-un foreach. În PHP5 poți folosi list în mod direct pentru a mapa variabile dintr-un array multidimensional

$agenda = array(
   array('Martinel', '0727000000'),
   array('Toto', '0727010101')
);

foreach($agenda as list($nume, $tel)) {
	echo "$nume :: $tel \n";
}

Generatori

Îți permite să creezi funcții ce își păstrează starea de la o rulare la alta. Se folosește de un nou construct, yield, ce poate fi folosit atât pentru input cât și pentru output.

Când ajunge la o linie ce conține yield, PHP va îngheța execuția funcției și va continua să ruleze fluxul principal al programului. Când îi spui să continue, PHP se va duce și va dezgheța funcția de unde a rămas, conservând valorile oricărei variabile locale definite până acolo.

Acest construct permite implementarea conceptului de Lazy Evaluation, ce îți permite să definești seturi infinite de date.

Spre exemplu, mulțimea numerelor Naturale poate fi definită astfel:


function numere() {
 $numar = 0;
 while(true) {
   $numar++;
   yield $numar;
 }
}


$num = numere();
$num->current(); // o sa fie 1

/*la next(), PHP dezgheata executia functiei unde a ramas, 
adica in blocul while, deci numar nu se redeclara 
ca fiind 0
*/
$num->next(); 
$num->current(); // o sa fie 2
?>

Celălalt mod în care se mai poate folosi yield este de a trimite data către funcție în timpul rulării.


function perfetsqr() {
	while(true) {
		$v = yield;
		echo ($v * $v) . "\n";
	}
}

$multi = perfectsqr();
for($i = 0; $i < 10; $i++) {
	$multi->send($i);
}

Acesta este un simplu generator de pătrate perfecte. Toți generatorii pornesc dintr-o stare de pauză, din care se dezgheață în momentul în care se trimite un send sau un current până când ajunge la un yield.
Toate aceste lucruri ar fi putut fi făcute în vechiul PHP, însă generatorii ne oferă un mod mai elegant, mai eficient și mai rapid. Plus, un generator poate fi folosit într-un foreach.

Posted in PHP