Logické výrazy a operátory v PHP.
11.6.2004 15:00 | Petr Zajíc | přečteno 126357×
Logické operátory se v PHP víceméně neliší od stejných operátorů v
jiných programovacích jazycích, ale to neznamená, že je v našem
tutoriálu vynecháme. Pojďme se tedy podívat, jak se používají. Pokud
logické výrazy chronicky znáte z jiných programovacích jazyků, možná
můžete tento díl přeskočit.
Již jsme si uvedli, že PHP má datový typ boolean reprezentovaný hodnotami TRUE a FALSE. Má také operátory, které Vám umožní s nimi pracovat. Především bychom si měli ale říci, že pro logické operace se nedoporučuje používat klasické operátory "+", "-", "*" a "/". Když to uděláme, neskončí to chybou, protože PHP provede přetypování. Nicméně, chování programu bude většinou zvláštní. Dokázali byste si například tipnout, co vrátí následující kód?
<?
$pravda =TRUE;
echo "Logický nesmysl ".$pravda + $pravda."<BR>\n";
?>
Asi se Vám to první pohled bude zdát divné, ale výsledkem bude pouhá
jednička. PHP totiž první řetězec převedl na LOGICKOU hodnotu a pak s
ní tak pracoval. Z toho je myslím patřičně vidět, že potřebujeme
logické operátory. V PHP existují následující:
Operátor |
Význam |
Pravda když |
and |
Logický součin |
Jsou obě hodnoty pravdivé |
or |
Logický součet |
Je alespoň jedna hodnota pravdivá |
xor |
Exkluzivní OR |
Je právě jedna hodnota pravdivá |
! |
Negace |
True když bylo False a naopak |
&& |
Logický součin |
Jsou obě hodnoty pravdivé |
|| |
Logický součet |
Je alespoň jedna hodnota pravdivá |
Několik příkladů to vysvětlí:
<?
// jestliže například
$mam_papir=TRUE; $mam_inkoust=TRUE;
// ... je jasné, že
$mohu_tisknout=$mam_papir && $mam_inkoust;
// což je totéž jako
$mohu_tisknout=$mam_papir and $mam_inkoust;
?>
Tady se jednalo o logický součin.
Pokud chci tisknout, musím mít jak papír,
tak i inkoust.
<?
// jestliže například
$mam_penize_doma=FALSE; $mam_penize_v_bance=TRUE;
// ... je jasné, že
$mam_penize=$mam_penize_doma || $mam_penize_v_bance;
// což je totéž jako
$mam_penize=$mam_penize_doma or $mam_penize_v_bance;
?>
Tady se jednalo o logický součet. Peníze mám jak v případě, že jsou doma, tak i v případě, že jsou v bance ;-))). Peníze mám dokonce i případě, že jsou jak doma tak i v bance, proto se jedná o neexkluzivní OR.
<?
$mam_malo_penez = true;
$jsem_bohaty =
!$mam_malo_penez;
echo (integer)$jsem_bohaty;
?>
Negace je myslím jasná. Jestliže mám
málo peněz, pak nejsem bohatý.
Ve skriptu si můžete všimnout jedné věci: nevypsal jsem hodnotu
proměnné $jsem_bohaty, ale její reprezentaci jakožto celého čísla. Echo
$jsem_bohaty by vrátilo prázdný řetězec, současný kód však vrací nulu.
Proč je to tak bylo popsáno v díle o přetypování proměnných.
Logické exkluzivní OR (XOR) se používá v programování především na
šifrovací algoritmy a pro psaní webů se bez něj asi obejdate. Ať
přemýšlím jak přemýšlím, nepodařil se mi najít žádký příklad z praxe,
který by jej dostatečně ilustroval a ve svých skriptech jsem ho nikdy
nepoužil.
Dva operátory pro logický součet a dva operátory pro logický součit se od sebe liší prioritou. Bude o tom řeč v příštím díle našeho seriálu.
K logickým operátorům ještě jedna důležitá poznámka. Vždycky nemáme
při programování to štěstí, že logické výrazy jsou rovny buď FALSE nebo
TRUE. Při práci s databázemi se velice často stává, že musíme sáhnout k
"třístavové logice". Více o tom bude pojednáno v některém díle o MySQL,
ale měli bychom poznamenat, že z hlediska databází je někdy logická
hodnota buď TRUE, nebo FALSE nebo NEZNÁMÁ (NULL). Pozor na to.
Setkáte se s tím.
Příště se v našem seriálu podíváme na operátory, na které se zatím nedostalo, a na prioritu operátorů.