
Zbývá rozhodnout co s <?php
na začátku knihovny.
PHP se bez něj opravu neobejde a v JS vadí. Situace vypadá neřešitelně.
Nicméně můžeme využít principu, že na začátku souboru ještě před <?php
se jazyk PHP neiterpretuje protože PHP je ještě v HTML kontextu. Takže pokud <?php
z hlediska JS zakomentuji, tak se v PHP toto zakomentování jen normálně odešle na výstup. A to mohu ošetřit. Proto naše první knihovna bude vypadat takto:
- //<?php
- function my_fact($n)
- {
- if ($n<=1) return 1;
- return $n*my_fact($n-1);
- }
A tuto knihovnu můžeme normálně uložit do souboru s extenzí .php.js a vložit jak do JS tak do PHP :-).
Pro zkoušku si uděláme dvě aplikace na kterých to vyzkoušíme.
Javascriptová verze
Javascriptová aplikace je úplně primitivní, běžná HTML struktura obsahují INPUT
(identifikovaný přes id) a DIV
pro výsledek (zase identifikovaný přes id). Dále je tlačítko pro uskutečnění výpočtu (JS funkce navázaná přes onClick) a pak už je jen vložení naší CombiScriptové knihovny pro výpočet faktoriálu a funkce, která po spuštění tlačítka zjistí zadanou hodnotu a výsledek zapíše do stránky.
- <!doctype html>
- <HTML lang="cs">
- <HEAD>
- <META charset="UTF-8">
- <META name="viewport" content="width=device-width">
- <TITLE>Funkce faktorial</TITLE>
- </HEAD>
- <BODY style="text-align:center">
- <INPUT id=argument>
- <INPUT type=button value="Spocti faktorial" onclick="Spocti()">
- <DIV id=Vysledek></DIV>
- <SCRIPT src="./my_lib.php.js"></SCRIPT>
- <SCRIPT>
- function Spocti()
- {
- var value = document.getElementById("argument").value;
- document.getElementById("Vysledek").innerHTML = my_fact(value);
- }
- </SCRIPT>
- </BODY>
- </HTML>
- //<?php
- function my_fact($n)
- {
- if ($n<=1) return 1;
- return $n*my_fact($n-1);
- }
Zdrojové kódy a spustitelný příklad výpočtu faktoriálu v JS
PHP verze
V aplikaci, kde stejnou knihovnu vkládáme do PHP se zbývá zbavit odeslání komentáře //
, který se pošle na výstup před <?php
. Řešení je jednoduché, použijeme ob_ funkce, výstup odchytíme a zahodíme. Zbytek aplikace je opět zcela standardní formulář, přes name pojmenovaný input, který z $_GET odchytíme a předáme funkci faktoriál z inludované knihovny.
- <!doctype html>
- <HTML lang="cs">
- <HEAD>
- <META charset="UTF-8">
- <META name="viewport" content="width=device-width">
- <TITLE>Funkce faktorial</TITLE>
- </HEAD>
- <BODY style="text-align:center">
- <FORM method=GET>
- <INPUT name=argument value="<?= $_GET['argument'] ?>">
- <INPUT type=submit value="Spocti faktorial">
- </FORM>
- <?php
- ob_start();
- include_once('./my_lib.php.js');
- ob_end_clean();
- if ($_GET['argument']!==null)
- {
- echo my_fact($_GET['argument']);
- }
- ?>
- </BODY>
- </HTML>
- //<?php
- function my_fact($n)
- {
- if ($n<=1) return 1;
- return $n*my_fact($n-1);
- }
Zdrojové kódy a spustitelný příklad výpočtu faktoriálu v PHP používající stejnou knihovnu
První CombiScriptová knihovna
A toto je naše první CombiScriptová knihovna. Hrozně ošklivá a bez důležitých ošetření. Ale výpočet faktoriálu opravdu používá stejný soubor jak pro PHP tak pro JS. A pokud v něm uděláme nějakou změnu promítne se do obou aplikací.
Samozřejmě, že výpočet faktoriálu je jen příklad. Představte si nějakou mnohem složitější transformaci, kterou potřebujete napsat na serveru i na klientovi (třeba převod na QR kód). To určitě nechcete psát dvakrát. A přesně toto Vám Combiscript umožní.
A v příštím díle se dozvíme jak se obejít bez "ob_" funkcí. Zapojte svou kreativitu a zkuste na řešení přijít!