
Jako další příklad si vyzkoušíme naprogramovat funkci pro výpočet přepony pravoúhlého trojúhelníka. Na chvilku zapomeneme, že pro odmocninu by šlo použít umocnění na polovinu a budeme chtít použít funkce sqrt v PHP a Math.sqrt v JS. Což napovídá, že si napíšeme vlastní funkci sqrt, kterou pak budeme používat.
Protože sqrt nebude jediná funkce, kterou potřebujeme vytvořit, tak si nejprve musíme vytvořit nějaký systém jak tyto funkce budeme pojmenovávat. Jako nejjednodušší se zdá všem dát stejný prefix. Prefix bych chtěl odvodit od slova number, protože se bude jednat o funkce pracující s čísly. Protože prefix "nm_" je v PHP volný a JS vůbec podtržítka v názvech funkcí nepoužívá, tak definuji, že všechny matematické (numerické) funkce budou začínat nm_.
Založíme si tedy funkci nm_sqrt v které potřebujeme udělat větev pro JS a pro PHP. Jako první co nás asi napadne je pro rozlišení JS a PHP použít operátor + nad stringy. V PHP dojde k převodu na číslo v JS při použití operátoru "+" nad stringy dojde k jejich spojení. Výsledkem je takováto (nepříliš hezká) knihovna:
- <!-- --><?php
- "use strict";
- function nm_sqrt($x)
- {
- if ('1'+'1'==='11') return Math.sqrt($x);
- return sqrt($x);
- }
- function my_pyth($a, $b)
- {
- return nm_sqrt($a*$a + $b*$b);
- }
Tuto knihovnu vložíme do JS i PHP scriptu a vyzkoušíme funkčnost.
- <!doctype html>
- <HTML lang="cs">
- <HEAD>
- <META charset="UTF-8">
- <META name="viewport" content="width=device-width">
- <TITLE>Funkce pythagoras</TITLE>
- </HEAD>
- <BODY style="text-align:center">
- <INPUT id=a>
- <INPUT id=b>
- <INPUT type=button value="Spocti preponu" onclick="Spocti()">
- <DIV id=Vysledek></DIV>
- <SCRIPT src="./my_lib.php.js"></SCRIPT>
- <SCRIPT>
- function Spocti()
- {
- var a = document.getElementById("a").value;
- var b = document.getElementById("b").value;
- document.getElementById("Vysledek").innerHTML = my_pyth(a, b);
- }
- </SCRIPT>
- </BODY>
- </HTML>
- <!-- --><?php
- "use strict";
- function nm_sqrt($x)
- {
- if ('1'+'1'==='11') return Math.sqrt($x);
- return sqrt($x);
- }
- function my_pyth($a, $b)
- {
- return nm_sqrt($a*$a + $b*$b);
- }
Popis jednotlivých scriptů už dělat nebudu, je zřejmý a vychází z příkladu z faktoriálem.
- <!doctype html>
- <HTML lang="cs">
- <HEAD>
- <META charset="UTF-8">
- <META name="viewport" content="width=device-width">
- <TITLE>Funkce pythagoras</TITLE>
- </HEAD>
- <BODY style="text-align:center">
- <FORM method=GET>
- <INPUT name=a value="<?= $_GET['a'] ?>">
- <INPUT name=b value="<?= $_GET['b'] ?>">
- <INPUT type=submit value="Spocti preponu">
- </FORM>
- <?php
- include_once('./my_lib.php.js');
- if ($_GET['a']!==null)
- {
- echo my_pyth($_GET['a'], $_GET['b']);
- }
- ?>
- </BODY>
- </HTML>
- <!-- --><?php
- "use strict";
- function nm_sqrt($x)
- {
- if ('1'+'1'==='11') return Math.sqrt($x);
- return sqrt($x);
- }
- function my_pyth($a, $b)
- {
- return nm_sqrt($a*$a + $b*$b);
- }
Závěr: Toto řešení pricipiálně funguje, má ovšem celou řadu nevýhod:
- Při každém použití funkce nm_sqrt se něco vyhodnocuje, což program určitě zdržuje.
- Kontrolou syntaxe v PHP tato funkce prošla spíš náhodou. Javascriptové Math.sqrt() se v PHP bere stringové spojení konstanty Math a funkce sqrt, což rozhodně není moc dobré. Dovedu si představit, že v JS či v PHP bude nějaký operátor (např. ->), který takovýto zápis rozhodně nedovolí.
- Podmínka if ('1'+'1'==='11') je fakt neuvěřitelně dlouhá.
A právě touto podmínkou začneme. V příštím díle si ukážeme jak takovouto podmínku odlišující JS a PHP napsat na mnohem méně znaků. Kdo zná PHP a JS opravdu dobře tak se může uvnitř if(..) dostat na pouhé dva znaky. Zkuste to!