Lekce 7 - Podmínky v PHP podruhé - přetypování, skládání a switch
V předešlém cvičení, Řešené úlohy k 6. lekci PHP, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Okolo podmínek je ještě nějaká teorie, která by vám do budoucna chyběla. Nezbývá, než se do ní pustit v dnešním PHP tutoriálu.
Datový typ boolean
S podmínkami úzce souvisí datový typ boolean
. Ten nabývá
pouze dvou hodnot a to true
(pravda) a false
(nepravda). Někdy bývají tyto konstanty psány velkými písmeny. Zkusme si
takovou proměnnou vytvořit:
{PHP}
$pozdravit = true;
if ($pozdravit == true)
echo('Ahoj');
{/PHP}
Kód výše se ptá, zda je v proměnné $pozdravit
hodnota
true
. Pokud ano, vypíše pozdrav. Hodnoty true
a
false
se opravdu často používají u nějakého nastavení
programu.
Když se na relační operátory v podmínkách zaměříme podrobněji, tak
vždy vracejí výsledek typu boolean
(např. 5 > 2
vrátí hodnotu true
). Podmínka vždy skončí buď u toho, že
platí nebo že neplatí. Do podmínky můžeme typ boolean
vložit
rovnou bez operátoru:
{PHP}
$pozdravit = true;
if ($pozdravit)
echo('Ahoj');
{/PHP}
Pokud výraz v závorce podmínky vrátí ve výsledku true
nebo
false
, možná vás napadlo, zda jde výsledek podmínky uložit do
proměnné typu boolean
a použít ho k vyhodnocení až později.
Ano, je to možné:
$podminka = (15 > 3); if ($podminka) { // ... }
Porovnávání a přetypování
Již víme, že operátor ==
slouží k porovnání hodnot. A
také víme, že je PHP dynamickým jazykem a datové typy proměnných samo
převádí podle toho, jak s nimi pracujeme. K tomuto
přetypování dochází i při používání podmínek. Je
opravdu velmi důležité, abyste věděli, jak funguje. Jinak vás chování
PHP může překvapit nebo dokonce způsobíte bezpečnostní díru ve své
aplikaci.
Přetypování na boolean
Pokud do podmínky zadáme proměnnou jakéhokoli datového typu, bude
automaticky převedena na boolean
(tedy na pravdu nebo nepravdu).
Pokud jako výraz zadáme nenulové číslo, podmínka bude
vždy platit a to i pro záporná čísla:
{PHP}
$a = 5;
if ($a)
echo('Platí');
{/PHP}
U řetězců bude podmínka platit v případě, že má nenulovou délku:
{PHP}
$s = 'itnetwork';
if ($s)
echo('Platí');
{/PHP}
U polí je to podobné. Pokud v poli něco je, bude podmínka platit:
{PHP}
$cisla = array(1, 2, 3);
if ($cisla)
echo('Platí');
{/PHP}
Toto může někdy zjednodušit práci. Podmínku s číslem využijeme v
případě, že číslo označuje nějaký počet. Ušetříme si
> 0
. S polem je to podobné, tam si ušetříme
count($cisla) > 0
. Řetězec zas splní podmínku jen tehdy,
když je zadaný (můžeme tak zkontrolovat, zda uživatel např. vyplnil
nějaké formulářové pole).
U všech výše uvedených zápisů můžeme samozřejmě použít i negaci, např. takto:
{PHP}
$jmeno = '';
if (!$jmeno)
echo('Nemůžeš mít prázdné jméno.');
{/PHP}
Porovnávání proměnných různých datových typů
Zajímavé to začne být zejména ve chvíli, kdy dojde při porovnávání k automatické (implicitní) konverzi datového typu. To se děje zejména u čísla a řetězce.
Asi vás nepřekvapí, že když porovnáme to samé číslo jako číslo a jako řetězec, bude podmínka platit:
{PHP}
$a = 2;
$b = "2";
if ($a == $b)
echo('Platí');
{/PHP}
PHP zjistí, že je na levé straně číslo a pokusí se na číslo
převést i stranu pravou. Zde se mu to podaří. Ve finále porovnává číslo
2
a číslo 2
, která jsou stejná.
Možná si vzpomínáte, že PHP je poměrně aktivní (až moc) a snaží se převést typy za každou cenu. Podmínka v příkladu níže stále platí, i když by to už mohlo někoho zaskočit:
{PHP}
$a = 2;
$b = "2Ahoj, jak se máš?";
if ($a == $b)
echo('Platí');
{/PHP}
PHP vydoluje z řetězce dvojku a ve finále tedy porovnává zas dvě dvojky. Aby toto fungovalo, musí číslem řetězec začínat.
Do třetice si ukažme něco, co byste asi nečekali. Asi tušíte, že podmínka bude platit i v tomto posledním případě:
{PHP}
$a = 0;
$b = "Ahoj, jak se máš?";
if ($a == $b)
echo('Platí');
{/PHP}
Proč tomu tak je? PHP zjistí, že porovnáváme číslo s něčím jiným a
chce převést řetězec na číslo. Když se mu to nepodaří, místo chyby
prohlásí, že je výsledek 0
. A nula se přeci rovná nule
Porovnávání v závislosti na typu
Pokud vám výše zmíněné chování připadá poněkud divoké, máte
pravdu. Někdy ušetří práci, ale někdy je lepší porovnávat v závislosti
na datovém typu. To platí zejména pro textové řetězce. Pokud místo dvou
==
použijeme tři (===
), výraz vrátí
true
jen v případě, že jsou hodnoty v proměnných opravdu
stejné a mají stejný datový typ:
{PHP}
$a = 0;
$b = "Ahoj, jak se máš?";
if ($a === $b)
echo('Platí');
{/PHP}
Nyní se již podmínka nesplní. To samé by platilo i pro číslo a řetězec:
{PHP}
$a = 2;
$b = "2";
if ($a === $b)
echo('Platí');
{/PHP}
Textové řetězce bychom měli porovnávat spíše třemi
===
.
Skládání podmínek
Podmínky je možné skládat a to pomocí dvou základních logických operátorů:
Operátor | C-like zápis |
---|---|
A zároveň | && |
Nebo | || |
Na české klávesnici můžeme napsat znak &
za pomocí klávesy pravý ALT a písmene C. Znak
|
taktéž za pomocí klávesy pravý ALT ale písmene
W:

Uveďme si příklad, zkontrolujme, zda je dané číslo v rozmezí
10-20
:
{PHP}
$a = 15;
if (($a >= 10) && ($a <= 20))
echo("Zadal jsi správně");
else
echo("Zadal jsi špatně");
{/PHP}
Takto bychom mimochodem mohli validovat např. věk zadaný z formuláře. To
již umíme. Operátory se pomocí závorek samozřejmě dají kombinovat.
Zkontrolujme, zda je číslo v rozmezí 10-20
nebo
30-40
:
{PHP}
$a = 35;
if ((($a >= 10) && ($a <= 20)) || (($a >=30) && ($a <= 40)))
echo("Zadal jsi správně");
else
echo("Zadal jsi špatně");
{/PHP}
switch
Abychom podmínky dobrali, představme si ještě konstrukci
switch
. Jedná se vlastně o alternativní zápis sekvence
if
...else
. switch
(česky přepínač)
umožňuje jednoduše reagovat na různé hodnoty nějaké proměnné. Ukažme
si náš skript pro zpracování výpočtu kalkulačky, kde místo sekvence
if
...else
použijeme právě 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ýsledek: $vysledek");
Za klíčovým slovem switch
vložíme do závorky proměnnou,
jejíž hodnoty chceme opodmínkovat. Tělo switch
je v bloku ze
složených závorek. Jednotlivé případy označíme slovem case
a za ně vložíme dvojtečku. Dále normálně píšeme příkazy, které se
mají stát. Nejsou zde žádné složené závorky a příkazů zde může být
více. Za posledním je nutné vždy uvést příkaz break
.
Můžeme také použít případ default:
, který se provede tehdy,
když neplatí ani jedna možnost.
Osobně switch
příliš nepoužívám. Nepřijde mi, že něco
zjednodušuje a správný programátor ho příliš často nepotřebuje. Ono se
takové bezduché větvení v programech většinou nepoužívá, jelikož jsou
elegantnější a mnohem kratší zápisy, jak danou situaci řešit (třeba
polymorfismem, reflexí nebo anonymními funkcemi, ale na to máme ještě
hodně času ). Určitě na
switch
ale narazíte v cizích programech a dobrý PHP kurz by ho
měl zmínit.
Výsledek máte jako vždy přibalený v archivu níže.
V příští lekci, Kontaktní emailový formulář v PHP, budeme dělat kontaktní emailový formulář.
Komentáře


Zobrazeno 10 zpráv z 18. Zobrazit vše