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ť:
{PHP}
$pozdravit = true;
if ($pozdravit == true)
echo('Ahoj');
{/PHP}
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:
{PHP}
$pozdravit = true;
if ($pozdravit)
echo('Ahoj');
{/PHP}
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:
{PHP}
$a = 5;
if ($a)
echo('Platí');
{/PHP}
U reťazcov bude podmienka platiť v prípade, že má nenulovú dĺžku:
{PHP}
$s = 'itnetwork';
if ($s)
echo('Platí');
{/PHP}
Pri poliach je to podobné. Ak v poli niečo je, bude podmienka platiť:
{PHP}
$cisla = array(1, 2, 3);
if ($cisla)
echo('Platí');
{/PHP}
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:
{PHP}
$jmeno = '';
if (!$jmeno)
echo('Nemôžeš mať prázdne meno.');
{/PHP}
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ť:
{PHP}
$a = 2;
$b = "2";
if ($a == $b)
echo('Platí');
{/PHP}
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ť:
{PHP}
$a = 2;
$b = "2Ahoj, ako sa máš?";
if ($a == $b)
echo('Platí');
{/PHP}
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:
{PHP}
$a = 0;
$b = "Ahoj, ako sa máš?";
if ($a == $b)
echo('Platí');
{/PHP}
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:
{PHP}
$a = 0;
$b = "Ahoj, ako sa máš?";
if ($a === $b)
echo('Platí');
{/PHP}
Teraz sa už podmienka nesplní. To isté by platilo aj pre číslo a reťazec:
{PHP}
$a = 2;
$b = "2";
if ($a === $b)
echo('Platí');
{/PHP}
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 | || |
10-20
:
{PHP}
$a = 15;
if (($a >= 10) && ($a <= 20))
echo("Zadal si správne");
else
echo("Zadal si zle");
{/PHP}
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
:
{PHP}
$a = 35;
if ((($a >= 10) && ($a <= 20)) || (($a >=30) && ($a <= 40)))
echo("Zadal si správne");
else
echo("Zadal si zle");
{/PHP}
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.