Vysvětlení příkladu
Nezapomeňte:
![]()
Nejlépe spolu se čtením této stránky nahlížejte do kódu, dívejte se, kde co je a dumejte, co kód dělá.
K tomu si otevřete
index.phpze staženého kódu.
"Zadání" pro stránku (důležité pro UX/UI)
Stránka má za úkol "spočítat kvadratickou rovnici a říkat smysluplně uživateli, co spočítala".
![]()
Nejvíce kódu napíšeme, abychom přemýšleli jako návštěvník a vypořádali se s možnými chybami.
Popis PHP kódu (zpracování a výpis dat)
1. Kontrola / zpracování dat z formuláře + příprava textů k zobrazení:
Data kontroluje / připravuje tento kód:
// 1. Inicializace
$zpravy = new Zpravy;
$povinnaPolicka = [
['popisek' => "Koeficient A", 'jmeno' => "a"],
['popisek' => "Koeficient B", 'jmeno' => "b"],
['popisek' => "Koeficient C", 'jmeno' => "c"],
];
$formularVyplnenSpravne = FALSE;
$reseni = [];
$odpoved = "";
// 2. Zpracuj data
if (jeFormularOdeslan()) {
$kontrola = zkontrolujPovinnaPolicka($povinnaPolicka);
if ($kontrola !== TRUE) {
// chyba vyplnění povinných políček
$zpravy->pridejZpravy($kontrola);
} else if ((int)zjistiHodnotuPolicka('a') === 0) {
// chyba vyplnění koeficientu a (nesmí být 0)
$zpravy->pridejZpravu("Koeficient A nesmí být 0!", "chyba");
} else {
// konečně vyplněno správně :)
$formularVyplnenSpravne = TRUE;
$a = zjistiHodnotuPolicka('a');
$b = zjistiHodnotuPolicka('b');
$c = zjistiHodnotuPolicka('c');
$reseni = kvadratickaRovnice($a, $b, $c);
if (count($reseni) === 0) $odpoved = "Rovnice nemá řešení.";
if (count($reseni) === 1) $odpoved = "Rovnice má 1 řešení x=" . $reseni[0] . ".";
if (count($reseni) === 2) $odpoved = "Rovnice má 2 řešení: x<sub>1</sub>=" . $reseni[0] . " a x<sub>2</sub>=" . $reseni[1] . ".";
}
}![]()
Oproti příkladu z Kapitoly 6, který jen kontroloval data, vlastně přibyly tyto řádky:
// 1. Nastavení zpráv a výstupů
$reseni = [];
$odpoved = "";
// 2. Zpracuj data
} else if ((int)zjistiHodnotuPolicka('a') === 0) {
// chyba vyplnění koeficientu a (nesmí být 0)
$zpravy->pridejZpravu("Koeficient A nesmí být 0!", "chyba");
} else {
// konečně vyplněno správně :)
$a = zjistiHodnotuPolicka('a');
$b = zjistiHodnotuPolicka('b');
$c = zjistiHodnotuPolicka('c');
$reseni = kvadratickaRovnice($a, $b, $c);
if (count($reseni) === 0) $odpoved = "Rovnice nemá řešení.";
if (count($reseni) === 1) $odpoved = "Rovnice má 1 řešení x=" . $reseni[0] . ".";
if (count($reseni) === 2) $odpoved = "Rovnice má 2 řešení: x<sub>1</sub>=" . $reseni[0] . " a x<sub>2</sub>=" . $reseni[1] . ".";
}
}Komentář ke kódu:
![]()
Kromě příkazu
else if(na začátku 2. bloku kódu), který
- ošetřuje nesprávné zadání koeficientu A
celý kód vlastně jen
- připravuje proměnné (v 1. bloku) a
- počítá výsledek a sestavuje odpověď
$odpoved(2. blok).
![]()
Vlastní výpočet probíhá na řádku
$reseni = kvadratickaRovnice($a, $b, $c);.
Ze zjištěného$resenipak sestavíme$odpoved- úplně stejně jako při testu z matematiky.Výpočet tedy řeší funkce, kterou jsme si popsali o dvě stránky dříve a která je vyčleněná do knihovny.
Zbytek PHP kódu ve stránce vlastně "jen řeší ty opičárny okolo", jako ošetřování chyb a texty výsledků.To je správná aplikace principu Oddělení zájmů. Tak bychom měli právně programovat.
![]()
Podívejme se pro pořádek a úplnost i na kód funkce, která rovnici vypočítá.
Bude možná překvapivě ktátký. Funkci najdeme v
./knihovna/matematika.php.
function kvadratickaRovnice(float $a, float $b, float $c): array
{
$x = [];
$d = $b**2 - 4*$a*$c;
if ($d == 0) $x[] = -$b / (2*$a) ;
if ($d > 0) {
$x[] = (-$b + sqrt($d)) / (2*$a) ;
$x[] = (-$b - sqrt($d)) / (2*$a) ;
}
return $x;
}2. Výpis dat z formuláře (HTML část stránky)
Obsah stránky (text mezi hlavičkou a patičkou) vypisuje tento kód:
<?php if ($formularVyplnenSpravne) : ?>
<h2>Vypočítal jsem zadanou rovnici <?= $a ?>x<sup>2</sup> + <?= $b ?>x + <?= $c ?> = 0 takto:</h2>
<p><?= $odpoved ?></p>
<p><a href='./priklad.php'>➜ Chci zadat další rovnici</a></p>
<?php else : ?>
<h2>Zadej koeficienty A, B, C kvadratické rovnice ax<sup>2</sup> + bx + c = 0:</h2>
<?= $zpravy->zobraz() ?>
<?= vypisFormularStart("Zadej koeficienty kvadratické rovnice:") ?>
<?= vypisInput("Koeficient A", "a", "number") ?>
<?= vypisInput("Koeficient B", "b", "number") ?>
<?= vypisInput("Koeficient C", "c", "number") ?>
<?= vypisFormularKonec("Odešli") ?>
<?php endif; ?>![]()
Všimněte si, že kód obsahuje jen HTML kód + PHP příkazy
ifaecho.I takhle bychom měli správně programovat - oddělovat výpočty od výpisů. Kód se pak snáze upravuje.
![]()
Všimněte si také, že kód má 2 části (rozdělené příkazem
if-else):
- obsah stránky, pokud byl formulář vyplněn správně - zobrazuje řešení
- obsah stránky, pokud formulář nebyl vyplněn správně / ještě vůbec - zprávy a formulář
![]()
A do třetice si všimněte trochu odlišné syntaxe příkazu
if:Při programování obvykle používáme zápis
if ($podminka) { ... PHP kód } else { ... PHP kód }Pokud však neprogramujeme, ale především vypisujeme HTML, používá se často alternativní zápis
<?php if ($podminka) : ?> ... HTML kód <?php else : ?> ... HTML kód <?php endif ; ?>
![]()
Tvůrci PHP nám touto alternativní syntaxí umožňují dále zpřehlednit / zjednodušit kód:
Pro nás doposud obvyklý kód
<?php echo "<p>Výsledek je " . $reseni . "</p>" ; ?>umožňuje nahradit o něco kratším / přehlednějším kódem
<p>Výsledek je <?= $reseni ?></p>
![]()
Nebudu vás nutit tuto syntaxi používat.
I když ti, co by do budoucna např. mohli potkat programování na VŠ, by ji používat měli.Budu ale chtít, abyste o ní věděli a rozuměli jí, když ji uvidíte v kódu.
![]()
V "profi frameworcích" se pak používají tzv. šablonovací systémy, které navíc řeší i bezpečnost.