Zdá se, že PHP 5.3 bude ještě větší bomba, než jsme si mysleli. Do dlouho očekávané a neustále oddalované verze se na poslední chvíli dostaly lambda funkce a tzv. closures. Český ekvivalent termínu neznám, ale dalo by se použít anonymní nebo lambda funkce. Pokud máte zkušenost s JavaScriptem nebo jazykem Ruby, budou vám připadat velmi povědomé:

$lambda = function () {
	echo 'Hello World!';
};

$lambda(); // vypíše Hello World!

Lambda funkce najdou uplatnění především tam, kde potřebujeme vytvořit callback na jedno použití. Příkladem jsou třeba volání preg_replace_callback nebo array_map, které bylo doposud spojeno s nutností deklarovat funkci, která však pro zbytek programu byla zcela zbytečná. Od PHP 5.3 ji bude možné nahradit lambda funkcí:

// convert to camelCaps
$s = 'hello-world';
$s = preg_replace_callback(
	'#-([a-z])#',
	function ($matches) { return strtoupper($matches[1]); },
	$s
);
echo $s; // vypíše helloWorld

Closures rozšiřují schopnosti lambda funkcí tak, že jim zpřístupní (vybrané) proměnné z kontextu, ve kterém jsou deklarované:

function getMultiplier($product)
{
	return function ($value) use ($product) {
		return $value * $product;
	};
}

// $multi23 je "násobička 23"
$multi23 = getMultiplier(23);
echo $multi23(3); // vypíše 69

Jiným příkladem je přesměrování výstupu do souboru:

function redirect($file)
{
	$handle = fopen($file, 'w');
	ob_start(function($buffer) use ($handle) {
		fwrite($handle, $buffer);
	});
}

redirect('output.html');
echo 'Hello World!'; // místo na obrazovku se vypíše do souboru

Jak to funguje interně? Lambda funkce a closures jsou representovány objektem finální třídy Closure s jedinou magickou funkcí __invoke(). Ta sama o sobě zajišťuje, že s objekty spolupracují interní funkce a lze je použít všude tam, kde se očekává pseudotyp callback. Také is_callable($lambda) vrací true. Zapouzdření callbacku tak dostává nový rozměr:

class Salute
{
	public function __invoke($name)
	{
		echo "Hello $name!";
	}
}

$salute = new Salute;
$salute('World'); // vypíše Hello World!

Jsou lambda funkce v PHP skutečně tak převratnou novinkou? V PHP je totiž lze do jisté míry nahradit skrze eval nebo create_function. Jenže za jakou cenu – tělo funkce je nutné zapsat jako řetězec, což je nepřehledné a nefunguje zvýrazňování kódu v IDE, takové funkce nelze debugovat, je znemožněno použití opcode cache atd. Dá se říci, že lambda funkce legalizují osm let starou funkci create_function pro použití ve zdravém kódu.

Podrobný popis najdete v propozicích a můžete si je rovnou i vyzkoušet – stačí stáhnout vývojovou verzi PHP 5.3.