22. Volání interních funkcí PHP a JS

Ilustrační obrázek k článku: Volání interních funkcí PHP a JS
V článku si ukážeme, jak pomocí jediné podmínky zajistit, aby stejný kód v PHP i JS volal správnou nativní funkci a tím sjednotíme kód pro frontend i backend.

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:

  1. <!-- --><?php
  2. "use strict";
  3. function nm_sqrt($x)
  4. {
  5. if ('1'+'1'==='11') return Math.sqrt($x);
  6. return sqrt($x);
  7. }
  8. function my_pyth($a, $b)
  9. {
  10. return nm_sqrt($a*$a + $b*$b);
  11. }

Tuto knihovnu vložíme do JS i PHP scriptu a vyzkoušíme funkčnost.

  
  1. <!doctype html>
  2. <HTML lang="cs">
  3. <HEAD>
  4. <META charset="UTF-8">
  5. <META name="viewport" content="width=device-width">
  6. <TITLE>Funkce pythagoras</TITLE>
  7. </HEAD>
  8. <BODY style="text-align:center">
  9. <INPUT id=a>
  10. <INPUT id=b>
  11. <INPUT type=button value="Spocti preponu" onclick="Spocti()">
  12. <DIV id=Vysledek></DIV>
  13. <SCRIPT src="./my_lib.php.js"></SCRIPT>
  14. <SCRIPT>
  15. function Spocti()
  16. {
  17. var a = document.getElementById("a").value;
  18. var b = document.getElementById("b").value;
  19. document.getElementById("Vysledek").innerHTML = my_pyth(a, b);
  20. }
  21. </SCRIPT>
  22. </BODY>
  23. </HTML>
  1. <!-- --><?php
  2. "use strict";
  3. function nm_sqrt($x)
  4. {
  5. if ('1'+'1'==='11') return Math.sqrt($x);
  6. return sqrt($x);
  7. }
  8. function my_pyth($a, $b)
  9. {
  10. return nm_sqrt($a*$a + $b*$b);
  11. }

Popis jednotlivých scriptů už dělat nebudu, je zřejmý a vychází z příkladu z faktoriálem.

  
  1. <!doctype html>
  2. <HTML lang="cs">
  3. <HEAD>
  4. <META charset="UTF-8">
  5. <META name="viewport" content="width=device-width">
  6. <TITLE>Funkce pythagoras</TITLE>
  7. </HEAD>
  8. <BODY style="text-align:center">
  9. <FORM method=GET>
  10. <INPUT name=a value="<?= $_GET['a'] ?>">
  11. <INPUT name=b value="<?= $_GET['b'] ?>">
  12. <INPUT type=submit value="Spocti preponu">
  13. </FORM>
  14. <?php
  15. include_once('./my_lib.php.js');
  16. if ($_GET['a']!==null)
  17. {
  18. echo my_pyth($_GET['a'], $_GET['b']);
  19. }
  20. ?>
  21. </BODY>
  22. </HTML>
  1. <!-- --><?php
  2. "use strict";
  3. function nm_sqrt($x)
  4. {
  5. if ('1'+'1'==='11') return Math.sqrt($x);
  6. return sqrt($x);
  7. }
  8. function my_pyth($a, $b)
  9. {
  10. return nm_sqrt($a*$a + $b*$b);
  11. }

Závěr: Toto řešení pricipiálně funguje, má ovšem celou řadu nevýhod:

Emulace koule, animace, čisté CSS

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!

Předchozí   Následující