PHP 4 → 5 Kvůli převaze hostingů podporujících PHP jen do verze 4, programuji zatím stále v této překonané verzi. A je to občas utrpení, cpát všude & a přitom vědět, že v PHP 5 už nemusím.

Nicméně programovat v PHP 4 se dá s vědomím dopředné kompatibility, už jsem o tom jednou psal. Dnes jsem však narazil na zajímavý oříšek.

Potřeboval jsem naklonovat objekt, říkejme mu třeba $dolly. PHP4 má tendenci klonovat jakýkoliv objekt, který mu přijde pod ruku. Tedy stačí napsat $klon = $dolly a je hotovo. Protože však klonování není přesně to, co programátor v naprosté většině případů očekává (a navíc je to v Evropské unii zakázané), je třeba v přiřazení použít symbol reference: $klon = & $dolly. PHP5 tuto nutnost eliminuje a zápis $reference = $dolly vytvoří automaticky referenci. Ale to už určitě dávno víte.

Kompatibilní klonování

Dobrá, a co když skutečně chci v PHP5 $dolly naklonovat? K tomuto účelu slouží zcela nová konstrukce:

$klon = clone $dolly;

Bohužel, PHP4 si na tomto zápisu vyláme zuby, ohlásí Parse error a odporoučí se do věčných lovišť. A teď babo raď, jak napsat kód, který by fungoval v obou verzích?

První myšlenka byla příkaz do zdrojového kódu vložit jako řetězec (vyhnout se parseru) a pak jej spustit přes eval(). Ale nakonec mě napadlo, že přece zápis $dolly a ($dolly) je ekvivalentní. Ozávorkováním nic nezkazím. Takže v PHP5 lze klidně napsat také:

$klon = clone ($dolly);

A co na to PHP4? Ve své dětinské naivitě myslí, že tímto zápisem volám funkci clone(). Takže parse error je zažehnán a stačí jen deklarovat funkci clone(). Samozřejmě jen pro PHP verze 4:

if (PHP_VERSION < 5) eval('
	function clone($obj)
	{
		return $obj;
	}
');

That's all folks…