Hledáme fulltime PHP programátora do ITnetwork týmu - 100% homeoffice, 100% časově flexibilní #bezdeadlinu Mám zájem!
Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 50% výuky zdarma!
Discount week 50

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:

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

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:

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

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:

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

U řetězců bude podmínka platit v případě, že má nenulovou délku:

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

U polí je to podobné. Pokud v poli něco je, bude podmínka platit:

$cisla = array(1, 2, 3);
if ($cisla)
    echo('Platí');
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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:

$jmeno = '';
if (!$jmeno)
    echo('Nemůžeš mít prázdné jméno.');

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:

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

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:

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

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ě:

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

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:

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

Nyní se již podmínka nesplní. To samé by platilo i pro číslo a řetězec:

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

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:

AND a OR

Uveďme si příklad, zkontrolujme, zda je dané číslo v rozmezí 10-20:

$a = 15;
if (($a >= 10) && ($a <= 20))
    echo("Zadal jsi správně");
else
    echo("Zadal jsi špatně");

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:

$a = 35;
if ((($a >= 10) && ($a <= 20)) || (($a >=30) && ($a <= 40)))
    echo("Zadal jsi správně");
else
    echo("Zadal jsi špatně");

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ář.


 

Předchozí článek
Řešené úlohy k 6. lekci PHP
Všechny články v sekci
Základní konstrukce jazyka PHP
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
49 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (24)

 

 

Komentáře
Zobrazit starší komentáře (8)

Avatar
Rasťo Suchovský:25.1.2016 23:54

asanos, trošku som testoval (asi 5 minút), a dospel som k tomuto:

$e = true and false;
$f = true && false;
echo("<br />E = $e<br />F = $f");
$g = false and true;
$h = false && true;
echo("<br />G = $g<br />H = $h");

E = 1
F =
G =
H =

 
Odpovědět
25.1.2016 23:54
Avatar
Rasťo Suchovský:26.1.2016 0:19

asanos, už som to pochopil.

$a = true && false;    //false
$b = true and false;   //true

Je to preto, lebo operátor 'and' má nižšiu prioritu ako operátor '=' (a '=' má nižšiu prioritu ako '&&')

Takže druhý riadok môžeme zapísať takto:

($b = true) and false;

To znamená, že do $b sa uloží hodnota 'true' a potom sa vykoná "($b = true) and false", ktoré sa už neukladá nikam (teda aspoň som to tak pochopil).

To isté funguje aj pri '||' a 'or', keďže operátor 'or' má nižšiu prioritu ako operátor '=' (a '=' má nižšiu prioritu ako '||')

$a = false || true;    //true
$b = false or true;   //false

lebo

($b = false) or true;   //false

;)
Toto som sa práve naučil. :)

 
Odpovědět
26.1.2016 0:19
Avatar
1Pupik1989
Člen
Avatar
Odpovídá na Rasťo Suchovský
1Pupik1989:26.1.2016 12:01

http://php.net/…ecedence.php

Jen pro doplnění přehled priorit. Já nikdy nepřišel k čemu by mě "and" a "or" byly. :D

 
Odpovědět
26.1.2016 12:01
Avatar
Rasťo Suchovský:26.1.2016 14:35

No ja som nováčik, ktorý sa práve chystá na 8. diel. :)
Tiež vždy používam && a ||.
C# ovládam základy trochu, takže odtiaľ čerpám, keďže jazyky sú si podobné. :)
A potom google, samozrejme.

 
Odpovědět
26.1.2016 14:35
Avatar
František Kreisinger:5.3.2018 19:15

Za posledním příkazem v "case" není nutné vždy dát "break". Je ale nutno počítat s tím, že provede jak splněný "case" tak i všechny další "case" za ním až do "endswitch" nebo do výskytu "break". Někdy to lze využít.

Odpovědět
5.3.2018 19:15
Začátečník v PHP, HTML i webovém programování vůbec.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Mino19
Člen
Avatar
Mino19:13.11.2018 18:27

Mám problém s otvorením súboru vypocet.php

Zadám čislo1 aj čislo2 a následne vybereme možnosť (hociktorú)..klik­nem na tlačídlo spočítať a dostanem presne celý kód na stránku,ako to je možné ? Ako to riešiť ? Ďakujem pekne

 
Odpovědět
13.11.2018 18:27
Avatar
Matěj Bína
Člen
Avatar
Matěj Bína:15.2.2019 14:09

Pokusil jsem se na kalkulačku z předchozí lekce použít podmínku

if ($a && $b)

k ověření, zda jsou obě pole vyplněná. Funguje to hezky, dokud se do pole nezadá 0, protože jí PHP vyhodnotí jako false. Zkusil jsem

if (isset($a) && isset($b))

ale to normálně pustí skript dál a pak si stěžuje, že nemá zadaná čísla.
Po trošce kutání jsem přišel na to, že prázdné pole (i typu number) posílá prázdný string, který isset() nevidí jako null. K ověření číselnosti stringu se používá funkce is_numeric(), takže

if (is_numeric($a) && is_numeric($b))

konečně dělá, co má.
Je zajímavý, co všechno musí člověk vykoumat kvůli kalkulačce.

 
Odpovědět
15.2.2019 14:09
Avatar
Pavel Kubalík:24.11.2020 15:35

Dobrý den
Tak jsem se musel vrátit, a dořešit třetí příklad z lekce 5.
Konečně se mi to (po zkušenostech z příkladu lekce 6) podařilo a mohu z klidným srdcem (aspoň chvilku) pokračovat.
Čtu si obvykle dopředu a v různých zajímavých kurzech a kupodivu se mi mění případné budoucí směrování.
Musím opět vložit, že jsem celým tím projektem stále nadšen. Předpokládám, pokud se nic nezmění (např zdraví) a schopnost chápat, budu se snažit pozvolna studovat. taky pokud na to budu mít i peníze.
Jelikož stále paralelně pracuji na vytváření databáze "Matrika" pomocí SQLite a jsem s tím spokojen, asi netoužím (zatím) mít (= používat) na webu databázi.
Dále jsem si přečetl (v kurzu zabývajícím se zprovoznění databáze na webu pro začátečníky), že dnes již jsou aplikace k databázím vytvářeny pomocí objektového programování. Jistě chápete, že to ovlivnilo moje přemýšlení. Jak, to netřeba popisovat.
Já vím, chtělo by to spíš psát o probrané lekci apod. Myslím však, že jsem se již nachválil dost, co tedy psát více. Spíš je potřebné poctivě číst.
Děkuji PK

 
Odpovědět
24.11.2020 15:35
Avatar
t.teichmanova:11. února 18:10
Ahoj,
    nevím,zda sem můžu něco připojit. No, zkusím to. Jedná se o psaní podmínek.
Uvedu konkrétní příklad od Vás:

<?php

$a = 15;
if (($a >= 10) && ($a <= 20))
    echo("Zadal jsi správně");
else
    echo("Zadal jsi špatně");

?>

Nebylo by lepší volit a zadat konkrétní hodnotu pro provedení podmínky. Přikládám zdroják i když to nic světoborného neni.

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Kalkulačka</title>
    </head>
    <body>
        <?php
            $cislo = $_POST['cislo'];
                        if (($cislo >= 10) && ($cislo <= 20))
    echo("Zadal jsi správně");
else
    echo("Zadal jsi špatně");
        ?>
    </body>
</html>
 ----------------------------------------------------------------------------
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Podminky</title>
    </head>
    <body>
        <p>Zvolte číslo mezi 10 a 20 : .</p>
        <form method="POST" action="Volba.php">
            <input name="cislo" type="text" /><br />
            <input type="submit" value="Výběr" />
        </form>
    </body>
</html>

                                                                                                                       T.T.
 
Odpovědět
11. února 18:10
Avatar
Vladislav Efler:17. února 15:49

Když spustím cvičení přes xampp (příkaz čistě pouze zkopíruji celý odtud), obě tyto podmínky mi to naopak nesplní (neplatí), stránka po zadání "run" zůstává prázdná, čím to může být? Ostatní příklady souhlasí.
První:

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

Druhý:

$a = 0;
$b = "Ahoj, jak se máš?";
if ($a == $b)
    echo('Platí');
 
Odpovědět
17. února 15:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

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