Chyby v kóde
Ako sme už spomenuli v predchádzajúcej kapitole, počet opakovaní cyklu určujeme príslušným zadefinovaním troch výrazov, najmä podmienky. Ak by sme predchádzajúci príklad chceli opakovať nie tri razy ale napríklad stokrát, dosiahli by sme to malou jednoduchou zmenou. Naša podmienka by vyzerala $poradove_cislo < 101. Vyskúšajte si meniť toto číslo a uvidíte, že sa to zopakuje vždy toľkokrát, koľko chcete:) Správne ste pochopili, že za danej konfigurácie (nastavenia) prvého a posledného výrazu meníme počet opakovaní cyklu len jednoduchou zmenou čísla v tejto podmienke. Toto je dosť praktické, odporúčam zapamätať, pretože ak budete hocikedy potrebovať vykonať niečo viackrát alebo vami určený počet krát, pomocou tejto konfigurácie to viete vždy ľahko a rýchlo docieliť. Existuje množstvo rôznych zadefinovaní týchto troch výrazov, ktoré môžu zapríčiniť či už rovnaké alebo iné správanie cyklu FOR. Nateraz nám ale postačí táto praktická ukážka, ktorú určite využijeme ešte veľakrát.
Upozornil by som ale v tomto prípade na jednu vec a to je to, že nesprávnym zadefinovaním podmienky môže dojsť k cyklu, ktorý má príliš vysoký počet opakovaní alebo dokonca až nekonečne veľa opakovaní, čo vedie k nekonečnému cyklu (infinite loop). Ak by sme v našej podmienke použili oveľa vyššie číslo ako 101, napríklad 20 000, vykonávanie cyklu by trvalo oveľa dlhšie, resp. by sme mohli vidieť, ako sa postupne posledné kroky vykonávajú, ak scrollneme naspodok pravého okna v simulátore. Pri vyšších číslach, kedy sa má niečo vykonať príliš veľakrát, môže dojsť k tomu, že program spadne – skončí pre nedostatok (zahltenie) pamäte alebo štandardne zamrzne, prehliadač nebude reagovať. Najvyšší level tejto chyby je vykonanie nekonečného cyklu. Ako to dosiahneme? Zadaním podmienky, ktorá bude vždy splnená, takže cyklus nemá kedy skončiť. Skúste si vyskúšať náš príklad s podmienkou, ktorá vždy platí. Druhý výraz (podmienka) môže obsahovať iba slovo TRUE (vždy splnená podmienka, lebo pravda) alebo napríklad podmienku $poradove_cislo >= 1. Naše číslo je od začiatku číslo 1 a každým krokom cyklu sa zväčšuje o jedna, takže táto podmienka bude non stop splnená. Schválne si to vyskúšajte a uvidíte, ako vám pomaly začne prehliadač mrznúť. Je to preto, pretože sme ho príliš zahltili. Počítač celkovo, ale aj prehliadač, všetko má svoju obmedzenú pamäť. Každý príkaz si vyžaduje istú dávku pamäte a čím viacej príkazov a čím sú príkazy zložitejšie, tým míňame viac pamäte. Takýto cyklus zahltí totálne pamäť, pretože posiela nekonečnú požiadavku na nekonečný počet príkazov. Zo začiatku ich počítač alebo prehliadač bude schopný spracovávať, nie však takým rýchlym tempom, ako nové požiadavky stále prichádzajú. Postupne si ukladá požiadavky do zásoby a stíha vykonávať, čo sa mu len dá, až postupne dojde do bodu, že tých požiadaviek bude v zásobe príliš veľa.
Stav, kedy náš program obsahuje nekonečný cyklus, je v podstate chyba v programe. Chyba programu (kódu) môže byť čokoľvek, čo zapríčiní jeho zamrznutie alebo spadnutie. Ako sme si už povedali, takou chybou môže byť napríklad zadefinovanie nekonečného cyklu. Ďalší typ chýb, na ktoré by som rád podotkol a určite ich najmä v začiatkoch budete robiť, sú syntaktické. Syntaktické chyby sú tie, ktoré vznikajú použitím nesprávnej syntaxe jazyka PHP. Syntax jazyka je spôsob, pravidlá, štruktúra, ako sa jednotlivé príkazy správne zapisujú a využívajú. Tvrdenie, že viem programovať v jazyku PHP vlastne znamená, že viem jeho syntax a jeho pravidlá a podobne. Čím viac pravidiel, príkazov a princípov daného jazyka budeme vedieť, tým lepšie daný jazyk ovládame. Chyba nekonečného cyklu má tú nevýhodu, že nie je v čase spustenia programu programom overená. To znamená, že po napísaní kódu pre nekonečný cyklus zo záveru predchádzajúcej kapitoly, nám nič nepovedalo, že máme niekde chybu alebo že sa náš program nedá spustiť. Program sa spustil, ale potom zamrzol a spadol.
Naopak, syntaktické chyby (errory) sú časté a bez nich sa programovať ani nedá. Pri veľkom rozsahu kódu sa vyskytujú neustále. Výhodou ale je, že na dané chyby nás prostredie (program na písanie kódu alebo iné), v ktorom píšeme program, už niekedy za behu (počas písania) upozorňuje, aby sme si ich opravili. Pred samotným spustení programu je celý kód programu prečítaný a overovaný. To znamená, že sa kontroluje, či je napísaný správne. Ak sa nájde nejaká syntaktická chyba, program sa nespustí a hodí chybovú hlášku (error). Vďaka hláške programátor vie, kde a akú asi má chybu, vo väčšine je napísané na ktorom presne riadku a mieste je chyba a akého typu. Tieto chyby sú vypisované samozrejme v angličtine. Pre nás nie je teraz dôležité, aby sme všetkým typom chybám rozumeli a vedeli ich opraviť. Nateraz nám stačí vedieť, že ak pri spustení programu v pravom okne dostaneme nejaké errorovú hlášku, niečo máme zle. Je nutné skontrolovať si kód a pozrieť pozorne jednotlivé príkazy, či ich máme zapísané správne. Program sa nespustí, pokiaľ máme nejakú chybu. Ak danej chybe rozumieme, je to o to jednoduchšie.
Náš program môže ale obsahovať aj menej závažné (to je ale relatívne...) chyby. Po spustení programu, ako sme si už dávnejšie vysvetlovali, číta počítač program od hora dole a zaradom vykonáva jednotlivé riadky a príkazy, ktoré sú na nich. Ak sa na nejakom riadku vyskytne nejaká chyba, ale nie je syntaktická, program na danom riadku vypíše upozornenie (notice) o chybe. Rozdiel je, že pri syntaktickej chybe sa program nespustí vôbec a iba vypíše errorovú hlášku. V tomto prípade sa vykonajú všetky riadky navyše ale o upozornenie (notice) na danom riadku. Poďme si ale zopár chýb ukázať pre lepšie pochopenie. Na začiatok si ukážeme kód, ktorý bude obsahovať chybu, nebude však ale syntaktická. Mali by sme dostať upozornenie, že niečo nie je v poriadku.
<?php
echo "Tento riadok neobsahuje chybu.";
echo "Tento riadok obsahuje chybu. ".$nasa_premenna;
Vyskúšajte si tento kód. Vidíte pred jeho spustením, kde je chyba? Ak nie nevadí, hneď sa to dozvieme. Po spustení tohto kódu dostaneme chybové upozornenie. Kde je ale chyba na druhom riadku? Chyba je to, že na jeho konci chceme vypísať hodnotu premennej s názvom nasa_premenna. Čo je na tom zlé? Toto sme už robili veľakrát! Chyba je predsa v tom, že našu premennú nemáme nikde zadefinovanú (zadeklarovanú), takže program nevie, že existuje a ani nevie, akú má mať teda hodnotu. Aby sme teda náš kód opravili, musíme si našu premennú predtým, ako ju chcem použiť, zadeklarovať. Poďme teda na to, toto by sme už mali vedieť. Mohlo by to vyzerať takto:
<?php
$nasa_premenna = "Uz sme ju opravili :)";
echo "Tento riadok neobsahuje chybu.";
echo "Tento riadok obsahuje chybu. ".$nasa_premenna;
Ukážeme si ešte príklad nejakej jednoduchej syntaktickej chyby a pôjdeme ďalej, pretože typov takýchto chýb je dosť veľa a nejdeme sa s nimi zatiaľ príliš zaťažovať. Pravdepodobne sa s nimi postretávate počas písania kódu:-D Syntaktická chyba znamená, že máme chybu v syntaxe, čo znamená, že nemáme správny zápis príkazov alebo znakov. Medzi takéto chyby patrí napríklad, že nedáme bodkočiarku na koniec riadku s príkazom, alebo že použijeme zle úvodzovky, bodku alebo jednoducho hocičo, čo je zle. Príkaz echo vypisuje premennú, text alebo ich kombináciu. Keď vypisujeme iba text, vieme, že správna syntax je príkaz echo, medzera, dvojité úvodzovky, text, dvojité úvodzovky a bodkočiarka na záver. Čiže náš text musí byť ohraničený úvodzovkami. Skúsme ale použiť tento príkaz napríklad bez začiatočných úvodzoviek.
<?php
echo "Tento riadok neobsahuje chybu.";
echo Toto sa nevykona, lebo mame chybu!";
Po spustení dostaneme chybu (fatal error), ktorá nám hovorí, že na riadku 3 našlo neočakávaný string (reťazec znakov – text). Neočakávaný preto, lebo tam očakáva buď úvodzovky alebo premennú.