Podmínky, podmínkové příkazy
Jste zde
K čemu slouží podmínky v PHP, je pravděpodobně snadno pochopitelné i bez teoretických znalostí. Část skriptu se má vykonat pouze tehdy, jestliže je (nebo není) splněna nějaká podmínka, ve složitějších případech kombinace podmínek.
V našem příkladu Zpráva pro tento den budeme pochopitelně chtít, aby se zpráva zobrazovala v závislosti na tom, jaký je právě den - a právě k tomu podmínky využijeme.
Poznámka k teorii: v řadě učebnic se podmínkové příkazy řadí mezi tzv. řídící struktury, podobně jako příkaz return
.
Příkaz if
Základní příkaz, který umožňuje rozvětvit kód podmínkou. Syntaxe je následující:
if (VÝRAZ- tj. „obsah“ podmínky) { PŘÍKAZ, který se má vykonat }
Upravme nyní příklad Zpráva pro tento den. Kromě univerzální zprávy bude zobrazovat specifickou část, která se zobrazí pouze v určitý den (např. v pondělí, upravte si podle situace, tak, abyste vyzkoušeli zobrazení i nezobrazení zprávy).
<h4>Zpráva pro tento den</h4> <?php $name = 'Zdeněk'; function daily_message($name, $day) { //Přidáme 2 proměné pro počáteční a koncovou část zprávy, které se nebudou měnit $default_message1 = '<p>Jste přihlášeni k účtu ' . '<strong>' . $name . '</strong>. Dnes je ' . '<strong>' . $day . '</strong>.</p>'; $default_message2 = '<p>Ať se vám dnes všechno daří!</p>'; //Přidáme proměnnou $daily_message pro specifickou zprávu a naplníme ji prázdnou hodnotou $daily_message = ''; //Nyní vložíme podmínku. Pokud je pondělí, proměnná $daily_message změní hodnotu if ($day == 'Pondělí') { $daily_message = '<p>Nezapomeňte, ve 14 hod. je porada. </p>'; } //Spojíme všechny části zprávy. $message = $default_message1 . $daily_message . $default_message2; return ($message); } $day = t(date('l')); print daily_message($name, $day); ?>
Výsledek (pro situaci, že v podmínce je Pondělí
a je skutečně pondělí:
Zpráva pro tento den
Jste přihlášeni k účtu Zdeněk. Dnes je Pondělí.
Nezapomeňte, ve 14 hod. je porada.
Ať se vám dnes všechno daří!
Tento skript má daleko k dokonalosti, především proto, že „natvrdo“ pracuje pouze s českým překladem data a ještě ke všemu vyžaduje, aby podmínka obsahovala přesný řetězec včetně velkého písmene na začátku (schválně zkuste napsat pondělí
namísto Pondělí
: podmínka se vyhodnotí jako nepravdivá i v případě, že je pondělí). Nám však jde o vysvětlení a procvičení podmínkových příkazů, proto se nyní soustředíme na ně a opomineme ostatní funkcionalitu.
Kombinace if ... else
Nyní příklad upravíme tak, aby se při nesplnění podmínky zobrazil jiný (výchozí) text. To obstará kombinace příkazů if ... else
.
Příkaz else
odvětví část skriptu, která se provede v případě, že není splněna podmínka.
<h4>Zpráva pro tento den</h4> <?php $name = 'Zdeněk'; function daily_message($name, $day) { //Přidáme 2 proměné pro počáteční a koncovou část zprávy, které se nebudou měnit $default_message1 = '<p>Jste přihlášeni k účtu ' . '<strong>' . $name . '</strong>. Dnes je ' . '<strong>' . $day . '</strong>.</p>'; $default_message2 = '<p>Ať se vám dnes všechno daří!</p>'; //Přidáme proměnnou $daily_message pro specifickou zprávu a naplníme ji prázdnou hodnotou $daily_message = ''; //Nyní vložíme podmínku, která má 2 větve. První pro případ, že je pondělí, druhou (else) pro všechny ostatní situace. if ($day == 'Pondělí') { $daily_message = '<p>Nezapomeňte, ve 14 hod. je porada. </p>'; } else { $daily_message = '<p>Dnes se neděje nic zvláštního. </p>'; } //Spojíme všechny části zprávy. $message = $default_message1 . $daily_message . $default_message2; return ($message); } $day = t(date('l')); print daily_message($name, $day); ?>
Kombinace if - else
vyjadřuje situaci „buď - anebo“. Pro složitější situace, kdy existuje více variant, potřebujeme další příkazy.
Příkaz elseif a switch
Příkazy elseif
a switch
umožňují vyhodnotit více variant, tedy rozvětvit skript na více větví než 2. Oba příkazy se používají v podobných situacích. Zatímco u menšího počtu variant se většinou používá příkaz elseif
, u většího počtu variant příkaz switch
(zápis je o něco stručnější). Vyzkoušíme je postupně.
Nyní náš příklad upravíme pro 3 možné varianty. Pokud je pondělí, informujeme o poradě. Jestliže je pátek, připomínáme odevzdání týdenního výkazu. V ostatních případech zobrazíme výchozí zprávu.
Příkaz elseif
si můžete volně přeložit jako „pokud ne, pak jestliže...“. Navazuje tedy na nesplnění první podmínky a zahajuje vyhodnocení podmínky další.
<h4>Zpráva pro tento den</h4> <?php $name = 'Zdeněk'; function daily_message($name, $day) { $default_message1 = '<p>Jste přihlášeni k účtu ' . '<strong>' . $name . '</strong>. Dnes je ' . '<strong>' . $day . '</strong>.</p>'; $default_message2 = '<p>Ať se vám dnes všechno daří!</p>'; $daily_message = ''; //Nyní vložíme podmínku, která má 3 větve. První pro případ, že je pondělí, druhou (elseif) pro případ, že je pátek, třetí (else) pro všechny ostatní situace. if ($day == 'Pondělí') { $daily_message = '<p>Nezapomeňte, ve 14 hod. je porada. </p>'; } elseif ($day == 'Pátek') { $daily_message = '<p>Nezapomeňte odevzdat týdenní výkaz. </p>'; } else { $daily_message = '<p>Dnes se neděje nic zvláštního. </p>'; } $message = $default_message1 . $daily_message . $default_message2; return ($message); } $day = t(date('l')); print daily_message($name, $day); ?>
Jak jsme si už řekli, stejného výstupu můžeme dosáhnout pomocí příkazu switch
, který má však zcela jinou syntaxi:
switch (HODNOTA proměnné) { case 'HODNOTA1': příkaz(y); break; case 'HODNOTA2': PŘÍKAZY; break; (...) default: PŘÍKAZY; }
Význam jednotlivých částí této struktury ozřejmí již pouhý překlad použitých termínů z angličtiny:
switch
- přepni (tj. přepínej hodnoty určité proměnné)case
- v případě, žedefault
- výchozí stav (nastane, pokud nenastala žádná z variant „case“).break
- přerušit (ukončit procházení větví struktury).
Zastavme se u příkazu break
. Jeho význam není na první pohled zřejmý, pokud by však chyběl, skript vykoná všechny větve struktury.
Nyní upravíme náš příklad - k dosažení stejného výsledku použijeme příkaz switch
.
<h4>Zpráva pro tento den</h4> <?php $name = 'Zdeněk'; function daily_message($name, $day) { $default_message1 = '<p>Jste přihlášeni k účtu ' . '<strong>' . $name . '</strong>. Dnes je ' . '<strong>' . $day . '</strong>.</p>'; $default_message2 = '<p>Ať se vám dnes všechno daří!</p>'; $daily_message = ''; //Nyní vložíme podmínku, která má 3 větve. První pro případ, že je pondělí, druhou (elseif) pro případ, že je pátek, třetí (else) pro všechny ostatní situace. switch ($day) { case 'Pondělí': $daily_message = '<p>Nezapomeňte, ve 14 hod. je porada. </p>'; break; case 'Pátek': $daily_message = '<p>Nezapomeňte odevzdat týdenní výkaz. </p>'; break; default: $daily_message = '<p>Dnes se neděje nic zvláštního. </p>'; } $message = $default_message1 . $daily_message . $default_message2; return ($message); } $day = t(date('l')); print daily_message($name, $day); ?>
K procvičení příkazu switch
a také pro zpříjemnění výstupu skriptu :-) nyní vložte ještě jednu větev navíc:
case 'Čtvrtek': $daily_message = '<p>Dnes večer můžete využít firemní vstupenky do wellnes centra, od 18 do 21 hod., jako obvykle. Platí pro 2 osoby, užijte si to. </p>'; break;
Příkaz switch by se nehodil pro případy, kdy je třeba vyhodnotit složitější podmínku, než jen hodnotu určité proměnné. Kdyby např. jedna z větví obsahovala podmínku pro den v týdnu a současně pro funkci na pracovišti (třeba pro zobrazení specifické zprávy vedoucím), bylo by nutné použít příkaz elseif
.
Alternativní způsoby zápisu
Pro některé řídící struktury je k dispozici také alternativní syntax, kterou názorně (jak doufáme :-)) vysvětluje následující obrázek.
Otevírací složená závorka se nahradí dvojtečkou :
a uzavírací složená závorka se nahradí odpovídajícím klíčovým slovem se středníkem.
V Drupalu se s alternativním zápisem setkáte velmi často. Důvodem je především snazší a přehlednější kombinace PHP a HTML kódu. S touto formou zápisu se proto setkáme zejména v šablonách Drupal témat, s kterými se ale seznámíme až někdy jindy. Nyní alespoň pro představu:
Příklad - první způsob zápisu:
<?php if ($day == 'Pondělí') { print ' <h2>Dnes je Pondělí</h2> '; } ?>
Odpovídající alternativní zápis:
<?php if ($day == 'Pondělí') : ?> <p>Dnes je Pondělí</p> <?php endif; ?>
Následující tabulka ukazuje přehled alternativních zápisů řídících struktur.
Příkaz | Alternativní příkaz pro ukončení |
---|---|
if | endif |
switch | endswitch |
while | endwhile |
for | endfor |
foreach | endforeach |
V tabulce jsou i doposud neprobírané podmínkové příkazy jako while
, for
a foreach
, kterým říkame cykly. Cykly vykonávají blok kódu dokud jej neukončíme příkazem nebo podmínkou. V našem tutoriálu se později blíže seznámíme pouze s cyklem foreach, se kterým se v Drupalu setkáte asi nejčastěji a slouží pouze k procházení polí a objektů.
Ternární operátor
Často se také k podmíněnému vyhodnocení výrazu používá tzv. ternární operátor. Díky němu např. nemusíme vypisovat porovnávanou proměnnou v podmínce dvakrát a zápis je kompaktnější. Jeho použití si ukážeme na příkladech:
<?php if ($day == 'Pondělí') { print 'Dnes je Pondělí'; } else { print 'Není Pondělí'; } ?>
Alternativní vyhodnocení pomocí ternárního operátoru:
<?php print ($day == 'Pondělí') ? 'Dnes je Pondělí' : 'Není Pondělí'; ?>