V čem spočívá rozdíl mezi následujícími dvěma kódy, které dělají totéž?
<?php // procedurální přístup $html = array(); foreach ($_REQUEST as $key => $val) { $html[$key] = htmlspecialchars($val); } // funkcionální přístup $html = array_map('htmlspecialchars', $_REQUEST); ?>
Protentokrát pominu, že druhý kód je kratší, protože pokud bychom na prvky pole chtěli aplikovat vlastní transformaci, museli bychom si ve druhém případě vytvořit vlastní funkci, kdežto v prvním případě bychom postup mohli napsat rovnou do kódu, takže by se poměr obrátil.
Hlavní kouzlo funkcionálního přístupu spočívá v tom, že funkci můžeme aplikovat na všechny prvky nezávisle – tedy klidně najednou. V dnešní době se běžně používají dvou- nebo čtyřjádrové procesory a myslím, že se dočkáme sestav třeba se 64 jádry, které půjde koupit v běžném obchodě. Pokud webový server vyřizuje najednou alespoň tolik požadavků, kolik má jader, tak na tom nemusí záležet, ale pokud je požadavků méně, tak při sériovém zpracování nemají některá jádra co na práci. Při paralelním zpracování je možné využít jádra všechna. Totéž platí i ve větším měřítku – zpracování některých úloh je lepší rozdělit na více serverů.
Druhé kouzlo spočívá v možnosti odloženého spuštění – protože je mapování jasně dané, tak ho nemusíme provádět ihned, ale až v okamžiku, kdy se výsledek pokusíme použít někde jinde.
Aby nedošlo k nedorozumění – PHP se o paralelní ani odložené zpracování v současné době nepokouší, ale jistě ho bude v budoucnu jednodušší implementovat u funkcionálního přístupu. Stačí, když volaná funkce nemění celkový stav programu (nezapisuje do statických a globálních proměnných, nic nevypisuje) a můžeme ji klidně spustit paralelně. A jde to dokonce i kdyby tento stav měnila – funkce array_map na rozdíl od foreach neručí za to, v jakém pořadí se funkce na jednotlivé prvky aplikuje.
Nevýhoda funkcionálního přístupu v PHP spočívá v tom, že je potřeba definovat funkce. PHP před verzí 5.3.0 na rozdíl třeba od JavaScriptu nemá anonymní funkce, což tento přístup komplikuje. Existuje sice funkce create_function, ta má ale tu nevýhodu, že kód sestavuje z řetězce za běhu, takže se např. nedá předem syntakticky zkontrolovat a program zpomaluje.
Diskuse je zrušena z důvodu spamu.