K čemu slouží ternární operátor, jistě vysvětlovat nemusím. Víte, že tyto dvě operace jsou ekvivalentní:

$a = $cond ? $x : false;

if ($cond) $a = $x; else $a = false;

Co ovšem možná nevíte, tak že ta první může být více než tisíckrát pomalejší. Stačí, aby proměnná $x obsahovala delší řetězec nebo pole.

Jak je to možné?

Reference counting

Jedna z úžasných vlastností jádra PHP 4 se nazývá Reference counting (pozor, nemá nic společného s klasickými referencemi). Díky ní nedochází ke kopírování dat okamžitě při přiřazení $a=$b, ale až je to potřeba, obvykle při změně jedné z proměnných. Fígl je v tom, že docela často hodnoty proměnných jen čteme, a tedy k jejich změně vůbec nedochází. Pak reference counting ušetří paměť a zvýší rychlost provádění skriptu.

Zkoumat jeho chování můžete funkcí debug_zval_dump (raději však xdebug_debug_zval) a sledováním hodnoty refcount. Doporučuji si s ní zaexperimentovat.

Klasické přiřazení $a = $b je tedy extrémně rychlé. A může být mnohem rychlejší, než vytvoření reference $a = &$b (podrobně v článku černá magie optimalizace). Pokud používáte reference namísto přiřazení kvůli rychlosti, dosahujete opačného efektu!

Tento kód je možné optimalizovat…

foreach ($arr => $val)
  if ($this->internalParameters['id'] == $val) ...

…pomocí klasické reference…

$p = & $this->internalParameters['id'];

foreach ($arr => $val)
  if ($p == $val) ...

…ale lepší bývá přístup bez reference:

$p = $this->internalParameters['id'];
...

A tím se dostáváme zpátky k problému s ternárním operátorem. Ten totiž, narozdíl od příkladu s konstrukcí if - else, kopíruje data ihned. Což značně zpomaluje provádění. Ale abych byl korektní – v případě, že budete obsah proměnné v dalších krocích měnit, tak stejně ke zkopírování paměťového bloku dojít musí, a pak nelze hovořit o zpomalení.

Je dobré pochopit chování reference counting a využívat ho. Pokud mezi proměnnými předáváte větší řetězce či pole, procházíte stromy a podobně, může dramaticky zrychlit provádění aplikace. Zajímavé je, že optimalizace pro něj spočívá ve vynechání (zdánlivě) zrychlujících konstrukcí a v psaní prostého kódu.