IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

7. diel - Podmienky v PHP druhýkrát - pretypovania, skladanie a switch

V predchádzajúcom cvičení, Riešené úlohy k 6. lekcii PHP, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii, Riešené úlohy k 6. lekcii PHP , sme si predstavili konštrukciu if a else. Tiež som si ukázali relačnej operátormi a rozšírili našu kalkulačku. Okolo podmienok je ešte nejaká teória, ktorá by vám do budúcna chýbala. Nezostáva, než sa do nej pustiť v dnešnom PHP tutoriálu.

Dátový typ boolean

S podmienkami úzko súvisí dátový typ boolean. Ten nadobúda iba dvoch hodnôt a to true (pravda) a false (nepravda). Niekedy bývajú tieto konštanty písané veľkými písmenami. Skúsme si takú premennú vytvoriť:

$pozdravit = true;
if ($pozdravit == true)
    echo('Ahoj');

Kód vyššie sa pýta, či je v premennej $pozdravit hodnota true. Ak áno, vypíše pozdrav. Hodnoty true a false sa naozaj často používajú u nejakého nastavenie programu.

Keď sa na relačnej operátormi v podmienkach zameriame podrobnejšie, tak vždy vracajú výsledok typu boolean (napr. 5 > 2 vráti hodnotu true). Podmienka vždy skončí buď pri tom, že platí alebo že neplatí. Do podmienky môžeme typ boolean vložiť rovno bez operátora:

$pozdravit = true;
if ($pozdravit)
    echo('Ahoj');

Ak výraz v zátvorke podmienky vrátia vo výsledku true alebo false, možno vás napadlo, či ide výsledok podmienky uložiť do premennej typu boolean a použiť ho na vyhodnotenie až neskôr. Áno, je to možné:

$podminka = (15 > 3);
if ($podminka)
{
    // ...
}

Porovnávanie a pretypovanie

Už vieme, že operátor == slúži na porovnanie hodnôt. A tiež vieme, že je PHP dynamickým jazykom a dátové typy premenných samo prevádza podľa toho, ako s nimi pracujeme. K tomuto pretypovanie dochádza aj pri používaní podmienok. Je naozaj veľmi dôležité, aby ste vedeli, ako funguje. Inak vás správanie PHP môže prekvapiť alebo dokonca spôsobíte bezpečnostnú dieru vo svojej aplikácii.

Pretypovanie na boolean

Pokiaľ do podmienky zadáme premennú akéhokoľvek dátového typu, bude automaticky prevedená na boolean (teda na pravdu alebo nepravdu). Ak ako výraz zadáme nenulovej číslo, podmienka bude vždy platiť a to aj pre záporné čísla:

$a = 5;
if ($a)
    echo('Platí');

U reťazcov bude podmienka platiť v prípade, že má nenulovú dĺžku:

$s = 'itnetwork';
if ($s)
    echo('Platí');

Pri poliach je to podobné. Ak v poli niečo je, bude podmienka platiť:

$cisla = array(1, 2, 3);
if ($cisla)
    echo('Platí');

Toto môže niekedy zjednodušiť prácu. Podmienku s číslom využijeme v prípade, že číslo označuje nejaký počet. Ušetríme si > 0. S poľom je to podobné, tam si ušetríme count($cisla) > 0. Reťazec zas splní podmienku len vtedy, keď je zadaný (môžeme tak skontrolovať, či používateľ napr. Vyplnil nejaké formulárové pole).

U všetkých vyššie uvedených zápisov môžeme samozrejme použiť aj negáciu, napr. Nasledovne:

$jmeno = '';
if (!$jmeno)
    echo('Nemôžeš mať prázdne meno.');

Porovnávanie premenných rôznych dátových typov

Zaujímavé to začne byť najmä vo chvíli, keď dôjde pri porovnávaní k automatickej (implicitné) konverziu dátového typu. To sa deje najmä u čísla a reťazce.

Asi vás neprekvapí, že keď porovnáme to isté číslo ako číslo a ako reťazec, bude podmienka platiť:

$a = 2;
$b = "2";
if ($a == $b)
    echo('Platí');

PHP zistí, že je na ľavej strane číslo a pokúsi sa na číslo previesť aj stranu pravú. Tu sa mu to podarí. Vo finále porovnáva číslo 2 a číslo 2, ktoré sú rovnaké.

Možno si spomínate, že PHP je pomerne aktívne (až moc) a snažia sa previesť typy za každú cenu. Podmienka v príklade nižšie stále platí, aj keď by to už mohlo niekoho zaskočiť:

$a = 2;
$b = "2Ahoj, ako sa máš?";
if ($a == $b)
    echo('Platí');

PHP vydolujete z reťazca dvojku a vo finále teda porovnáva zas dve dvojky. Aby toto fungovalo, musí číslom reťazec začínať.

Do tretice si ukážme niečo, čo by ste asi nečakali. Asi tušíte, že podmienka bude platiť aj v tomto poslednom prípade:

$a = 0;
$b = "Ahoj, ako sa máš?";
if ($a == $b)
    echo('Platí');

Prečo to tak je? PHP zistí, že porovnávame číslo s niečím iným a chce previesť reťazec na číslo. Keď sa mu to nepodarí, miesto chyby vyhlási, že je výsledok 0. A nula sa predsa rovná nule :)

Porovnávanie v závislosti od typu

Ak vám vyššie uvedené správanie pripadá trochu divoké, máte pravdu. Niekedy ušetrí prácu, ale niekedy je lepšie porovnávať v závislosti na dátovom typu. To platí najmä pre textové reťazce. Ak namiesto dvoch == použijeme tri (===), výraz vráti true len v prípade, že sú hodnoty v premenných naozaj rovnaké a majú rovnaký dátový typ:

$a = 0;
$b = "Ahoj, ako sa máš?";
if ($a === $b)
    echo('Platí');

Teraz sa už podmienka nesplní. To isté by platilo aj pre číslo a reťazec:

$a = 2;
$b = "2";
if ($a === $b)
    echo('Platí');

Textové reťazce by sme mali porovnávať skôr tromi ===.

Skladanie podmienok

Podmienky je možné skladať a to pomocou dvoch základných logických operátorov:

operátor C-like zápis
A zároveň &&
alebo ||
Uveďme si príklad, skontrolujte, či je dané číslo v rozmedzí 10-20:
$a = 15;
if (($a >= 10) && ($a <= 20))
    echo("Zadal si správne");
else
    echo("Zadal si zle");

Takto by sme mimochodom mohli validovať napr. Vek zadaný z formulára. To už vieme. Operátorov sa pomocou zátvoriek samozrejme dajú kombinovať. Skontrolujte, či je číslo v rozmedzí 10-20 alebo 30-40:

$a = 35;
if ((($a >= 10) && ($a <= 20)) || (($a >=30) && ($a <= 40)))
    echo("Zadal si správne");
else
    echo("Zadal si zle");

switch

Aby sme podmienky dopracovali, predstavme si ešte konštrukciu switch. Jedná sa vlastne o alternatívne zápis sekvencie if... else. switch (slovensky prepínač) umožňuje jednoducho reagovať na rôzne hodnoty nejaké premenné. Ukážme si náš skript pre spracovanie výpočtu kalkulačky, kde namiesto sekvencie if... else použijeme práve switch:

switch ($operace)
{
    case 'scitani':
        $vysledek = $a + $b;
        break;
    case 'odcitani':
        $vysledek = $a - $b;
        break;
    case 'nasobeni':
        $vysledek = $a * $b;
        break;
    case 'deleni':
        if ($b != 0)
            $vysledek = $a / $b;
        else
            $vysledek = 'Chyba';
        break;
}

echo("Výsledok: $vysledek");

Za kľúčovým slovom switch vložíme do zátvorky premennú, ktorej hodnoty chceme opodmínkovat. Telo switch je v bloku zo zložených zátvoriek. Jednotlivé prípady označíme slovom case a za ne vložíme dvojbodku. Ďalej normálne píšeme príkazy, ktoré sa majú stať. Nie sú tu žiadne zložené zátvorky a príkazov tu môže byť viac. Za posledným je nutné vždy uviesť príkaz break. Môžeme tiež použiť prípad default:, ktorý sa vykoná vtedy, keď neplatia ani jedna možnosť.

Osobne switch príliš nepoužívam. Nepríde mi, že niečo zjednodušuje a správny programátor ho príliš často nepotrebuje. Ono sa také bezduché vetvenia v programoch väčšinou nepoužíva, pretože sú elegantnejšie a oveľa kratšie zápisy, ako danú situáciu riešiť (napríklad polymorfizmom, reflexiou alebo anonymnými funkciami, ale na to máme ešte veľa času :) ). Určite na switch ale narazíte v cudzích programoch a dobrý PHP kurz by ho mal spomenúť. V budúcej lekcii, Kontaktný emailový formulár v PHP , budeme zas robiť niečo praktického a to kontaktný emailový formulár.


 

Predchádzajúci článok
Riešené úlohy k 6. lekcii PHP
Všetky články v sekcii
Základné konštrukcie jazyka PHP
Preskočiť článok
(neodporúčame)
Kontaktný emailový formulár v PHP
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
1 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity