
V minulém článku jsme si ukázali jak přepínat vykonávaný kód pomocí if([])
a zárověn jsme si řekli, že to není úplně ideální způsob, protože JS kód prochází PHP překladačem (a JS kód prochází PHP překladačem) což může způsobit chyby. Pokud jsme zakládali funkci nm_sqrt tak chyby překladu nenastaly. Viz:
- <!-- --><?php
- "use strict";
- function nm_sqrt($x)
- {
- if ([]) return Math.sqrt($x);
- return sqrt($x);
- }
Ale pokud bychom stejným způsobem chtěli napsat třeba univerzální funkci sort (pro JS i PHP) pro nějaký key=>value objekt:
- <!-- --><?php
- "use strict";
- function ar_sort($arr)
- {
- if ([]) return new Map([...$arr].sort());
- return $arr->asort();
- }
Tak kvůli ->
v JavaScriptu dostaneme syntaktickou chybu. My sice víme, že JS přes if ([])
vždy projde projde a k $arr->asort()
se kvůli return
u na předchozí řádce nikdy nedostane, ale kompilátor to neví a celý soubor odmítne kvůli této syntaktické chybě.
Je tedy zřejmé, že pokud chceme v naší knihovně použít libovolnou konstrukci jednoho jazyka, tak tento kód nesmí být pro druhý jazyk nejen spouštěný, ale ten druhý jazyk ho nesmí ani vidět. A tohoto docílíme jen jeho skrytím do komentáře.
K čemuž můžeme využít komentářový přepínač tak, že jeho začátek umístíme na místo, které je jedním jazykem bráno jako komentář a druhým jako kód, které je tedy střídavě zakomentované dle PHP či JS. Což je v našem případě první řádka scriptu, která je v JS považovaná za komentář. Výsledkem je takovýto script:
- <!-- --><?php /*
- "use strict";
- function ar_sort($arr)
- {
- return new Map([...$arr].sort());
- }
- /*/
- function ar_sort($arr)
- {
- return $arr->asort();
- }
- /*/
- function nm_sqrt($x)
- {
- return Math.sqrt($x);
- }
- /*/
- function nm_sqrt($x)
- {
- return sqrt($x);
- }
- //*/
Ovšem i tento způsob má spoustu problémů, které jsou způsobeny tím, že máme ve skutečnosti dvě různé funkce. Což se projeví např. pokud budeme chtít nějakou funkci ošetřit (samozřejmě stejně v PHP i v JS). Viz:
- <!-- --><?php /*
- "use strict";
- function nm_sqrt($x)
- {
- if ($x < 0) throw new Error('nm_sqrt-AgumentIsNegative');
- return Math.sqrt($x);
- }
- /*/
- function nm_sqrt($x)
- {
- if ($x < 0) throw new Error('nm_sqrt-AgumentIsNegative');
- return sqrt($x);
- }
- //*/
Vidíme že řádky 5. a 11. jsou naprosto stejné. Což určitě odporuje pravidlům správného programování, minimálně protože vidíme duplikovaný kód, který je náchylný k chybám při úpravách.
A v příštím díle si ukážeme jak uvnitř jedné funkce můžeme vytvořit dvě komentářové větve, jednu pro JS a druhou pro PHP