Jul 20

Lambda функции и Closures са неща, който от доста време се надявам да ги има в PHP, и това вече е факт. Жалкото е че PHP5.3 и PHP6 ще има да се чака много време, докато започнат да се използват масово.

Lambda функцията изглежда така:

function & (parameters) use (lexical vars) { body }

Ето няколко примера:

function replace_in_array ($search, $replacement, $array) {
	$map = function ($text) use ($search, $replacement) {
		if (strpos ($text, $search) > 50) {
			return str_replace ($search, $replacement, $text);
		} else {
			return $text;
		}
	};
	return array_map ($map, $array);
}

като много се надявам това да може да се напише и така:

function replace_in_array ($search, $replacement, $array) {
 	return array_map(function ($text) use ($search, $replacement) {
 		if (strpos ($text, $search) > 50) {
 			return str_replace ($search, $replacement, $text);
 		} else {
 			return $text;
 		}
 	}, $array);
}

Също така има и нов “магически” клас метод __invoke:

class Example {
	public function __invoke (){
		echo "Hello World!\n";
	}
}
$foo = new Example;
$foo();

Даже, вече го виждам как ще промени един мой клас за тестване на тагове – TagMatcher:

// сегашната версия
$matcher = new TagMatcher($tag1);
echo $matcher->match($tag2);

// бъдещата версия
$match = new TagMatcher($tag1);
echo $match($tag2);

Също така има промени и по Reflection API. За повече информация:

http://wiki.php.net/rfc/closures

В заключение, ще кажа че синтаксиса на Lambda функциите и Closures е наистина добър, като много напомня на този в JavaScript и изглежда като нормална част от PHP. И че PHP с новите подобрения, плюс няколко PECL добавки като  operator, classkit и runkit, и малко оптимизция става още по-мощен език.

Какво мислите по въпроса