> **Poznámka:** Tento článok môže byť pre niektorých začiatočníkov trochu neprehľadný, pretože predpokladá základné znalosti jazyka PHP. Ak vás zaujíma, ako podmienky fungujú, prečítajte si o podmienkach v kurze pre začiatočníkov.
Podpora: | Všetky verzie: PHP 4, PHP 5, PHP 7 |
---|---|
Stručný opis: | Overenie jedného alebo viacerých výrokov |
Typ: | Výrok, konštrukcia (nie funkcia) |
Často potrebujete určiť, či platí rovnosť alebo či je výrok pravdivý, na to slúžia podmienky. PHP používa nasledujúcu syntax ako mnohé iné jazyky (najmä C):
if (/* logický príkaz */) {// konštruovať}
Každý logický výraz má hodnotu TRUE
(pravda) alebo FALSE
(nepravda), iné možnosti neexistujú.
Príklad porovnania, či je premenná $x
väčšia ako premenná $y
:
$x = 10;$y = 5;if ($x > $y) {// Táto časť skriptu sa vykoná, ak je podmienka pravdivá} else {// Táto časť skriptu sa spustí, ak sa podmienka neuplatní}
Konštrukcia podmienky má povinný obsah v okrúhlych zátvorkách, v ktorom je uvedený výraz, ktorý sa má testovať, zložený z operátorov (prehľad nižšie), viaceré výrazy možno spájať pomocou logických operátorov (prehľad nižšie).
Okrem toho podmienka obsahuje dva voliteľné bloky príkazov.
Z praktických dôvodov vždy zahrňte aspoň prvý blok príkazov, keď je podmienka pravdivá, inak by testovanie výrazu nemalo zmysel.
Vo všeobecnosti:
Jediný možný zápis so stredníkom (okrem použitia konštrukcie endif):
if ($x > $y);
Takáto podmienka však nemá zmysel, pretože v oboch prípadoch sa výsledok porovnania zahodí a nevykoná sa žiadny príkaz patriaci do podmienky.
Za určitých okolností možno konštrukciu if
použiť s vynechaním zložených zátvoriek. To sa dá dosiahnuť len v nasledujúcich prípadoch:
Podrobnejšie informácie nájdete v nasledujúcich 3 kapitolách.
1. Len jeden príkaz ~ skrátená syntax
Ak vytvárate podmienku, v ktorej chcete vykonať len jednu konštrukciu (príkaz), môžete použiť buď klasický zápis v zložených zátvorkách:
if ($x > 10) { $y = $x; }
Alebo môžeme zátvorky vynechať:
if ($x > 10) $y = $x;
Toto správanie sa však vzťahuje len na jeden príkaz v bezprostrednej blízkosti podmienky.
Lepší príklad (podmienečne sa vykoná len konštrukcia $y = $x
, ostatné sa vykonajú vždy):
$x = 5;$y = 3;$z = 10;if ($x > $y)$y = $x;$x = 3;
2. Dvojbodka a endif;
if (/* výraz */):konstrukt;konstrukt;konstrukt;endif;
Tento zápis sa však už dlho považuje za zastaraný, pretože sa znižuje jeho orientácia, keď sa do seba ponorí viacero podmienok.
Poznámka: Rád by som poznamenal, že tento štýl sa páči aj niektorým ľuďom, napríklad Yuhovi (viď jeho článok). Chráň Boh, aby ste to niekde použili.
3. Ternárny výraz ~ jednoriadkový "in-line" zápis
Občas je užitočné vykonať jednoduché in-line porovnanie s nejakou inou akciou (napríklad spolu s definovaním novej premennej). Ak chceme vykonať len jeden príkaz, celý postup môžeme zredukovať na jeden riadok aj pri zachovaní čo najväčšej jednoduchosti.
$x = 5;$isBiggerThanTwo = ($x > 2 ? true : false);// alebo ešte kratšie:$isBiggerThanTwo = ($x > 2);// alebo bez zátvoriek:$isBiggerThanTwo = $x > 2;
V rámci podmienky sa používajú dva typy operátorov:
Operátor | Význam |
---|---|
== |
Rovná sa |
=== |
Rovná sa a má rovnaký dátový typ |
!= |
Nerovná sa |
>= |
Rovná sa alebo je väčšia |
<= |
Rovná sa alebo je menšia |
> |
Väčší |
< |
Menej |
Príklad (platí, keď $x nie je 5
):
if ($x != 5) { ... }
Operátor | Alternatíva | Význam | Pravda, keď: |
---|---|---|---|
&& |
AND | a zároveň | obe hodnoty sú pravdivé |
` | ` | OR | |
^^ |
XOR | exkluzívne OR | aspoň jedno je pravda alebo nepravda, ale nikdy nie oboje |
! |
doesn't | negácia výrazu | true keď false a naopak |
() |
neguje | negácia výrazu | závisí od okolností |
Zložitejší príklad:
$x = 5;$y = 3;$z = 8;if ($x > 0 && !($y != 2 && $z == $x) || $z > $y) { ... }
Často si môžeme dovoliť vynechať niektorý z operátorov (alebo dokonca oba), ale nikdy nesmieme zabudnúť na pravidlá správneho používania, aby výsledný výraz fungoval.
Vo všeobecnosti pri testovaní výrazu bez operátora testujeme, či je jeho hodnota TRUE
alebo či nie je prázdna (napríklad obsahuje nenulové číslo, neprázdny reťazec, ...).
Príklady:
$x = 5;$y = 3;$z = 8;if ($x) { ... } // prechádza, pretože $x nie je prázdnyif ($x && $y) { ... } // prechádza, pretože $x a $y nie sú prázdneif (!$x) { ... } // zlyhá, pretože TRUE je negovanéif (isset($z)) { ... } // prechádza, pretože premenná $z existuje
Môžu však nastať zložité situácie, najmä keď:
if ($x)
a premenná $x
obsahuje nulu (0
), potom podmienka nie je splnená.$x
obsahuje reťazec 0
(číslo nula), pretože sa prelieva do nuly, a preto výraz nie je pravdivý.'false'
ako reťazec, potom je podmienka opäť pravdivá, pretože reťazec nie je prázdny.Odporúčam jedno jednoduché a účinné riešenie - opýtajte sa na počet vrátených znakov. Ak je reťazec prázdny (alebo premenná neexistuje), potom sa vráti nula znakov a podmienka nie je splnená. Jednoduchý príklad:
$x = '0';if ($x) { ... } // podmienka sa zvyčajne neuplatňujeif (strlen($x)) { ... } // podmienka je platná, pretože $x obsahuje 1 znak
Ďalej môžeme testovať existenciu premennej pomocou funkcie isset()
.
Zistiť, že struny sú identické, je jednoduché:
$a = 'Mačka';$b = 'cat';if ($a === $b) {// Ak sú reťazce rovnaké} else {// Ak sa reťazce líšia}
Je dôležité riadne sledovať typy údajov v prípade, že položka môže byť ekvivalentná s inou položkou.
Napríklad prázdny reťazec $a = '';
sa líši od reťazca NULL
: $b = NULL;
. Toto rozlíšenie potrebujeme napríklad kvôli databázam, kde je rozdiel medzi tým, či hodnota neexistuje alebo je prázdna.
$a = '';$b = null;if ($a == $b) {// Vyhodnotí sa ako TRUE, pretože// dátový typ sa konvertuje.}if ($a === $b) {// Vykonáva oveľa prísnejšiu validáciu// a to neprejde, pretože je to iný// obsah a iný typ údajov, preto// tento kód sa nikdy nespustí.}
Pri porovnávaní reťazcov je tiež dobré ignorovať biele (neviditeľné) znaky, ako sú medzery, tabulátory a zalomenia riadkov. To je užitočné napríklad pri zadávaní hesla a jeho odovzdávaní hashovacej funkcii:
$password = '81dc9bdb52d04dc20036dbd8313ed055'; // 1234$userPassword = '1234';if (md5(trim($userPassword)) === $password) {// Funkcia trim() automaticky odstraňuje medzery.}
Niekedy sa môže stať, že hodnota neexistuje (nie je ani TRUE
ani FALSE
), ide hlavne o hodnotu získanú z databázy (napríklad sa pýtame na stĺpec, ktorý neexistuje), v takom prípade sa vráti dátový typ NULL
.
Vo všeobecnosti sa NULL
vyhodnotí ako FALSE
, t. j. podmienka neplatí. Toto správanie však nie je vždy vhodné, pretože neexistujúca hodnota nemusí nevyhnutne znamenať, že neexistuje žiadny záznam.
Príklad z praxe: Máme profil používateľa a dopytujeme sa na jeho webovú stránku. Nie všetci používatelia musia mať webovú stránku, takže v tomto prípade sa vráti
NULL
, ale používateľ stále existuje. V tomto prípade by sme teda mali radšej použiť funkciuisset()
na testovanie (ne)existencie premennej a nerobiť závery na základe konkrétnej hodnoty.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | sk