MareX WeBlog

PHP výuka - operátory

REKLAMA

Důležitou součástí programovacího jazyka jsou operátory. Umožňují provádět s hodnotami různé operace, ať už se jedná o porovnávání hodnot, jejich sčítání, násobení a další. Jak jsme si slíbili v minulém článku, dnes se na operátory podíváme trochu blíž.

S jedním operátorem, který se používá asi nejběžněji, jsme se už setkali. Je to operátor přiřazení: symbol ‘=’ (rovná se). Tento operátor přiřazuje třeba hodnoty proměnným:

$a = 20;

Teď jsme přiřadili proměnné $a hodnotu 20.

$b = $a;

Zde jsme přiřadili proměnné $b hodnotu proměnné $a, tedy 20.

Matematické operátory

Dalšími operátory, jsou ty, které všichni známe už ze školy a těmi jsou operátory matematické, které se používají pro běžné výpočty:

+ sčítání
- odčítání
* násobení
/ dělení
% modulo (zbytek po celočíselném dělení)

Ty první tři jsou snad jasné:

$a = 10+10;

V proměnné $a bude nyní hodnota 20, protože jsme jí přiřadili výsledek sčítání (10+10).

Možná ale někdo neví, co je modulo dělení. Někomu možná ani nepomůže, když napíšu zbytek po celočíselném dělení. Celočíselné dělení je takové dělení, jehož výsledek je vždy celé číslo (tedy číslo bez desetinné čárky). To se dělá tak, že se výsledek klasického dělení zaokrouhlí vždy dolu.

Například:

5 % 2

Výsledek by byl 2.5, jenže to není celé číslo, takže jej zaokrouhlíme dolu a vyjde nám 2. Možná si teď někdo řekne, jakto, že dolu, když podle jakýchsi matematických pravidel se pětka zaokrouhluje nahoru. Jenže po zaokrouhlení nahoru by nám vyšlo číslo 3 a to se nám bohužel do čísla 5 nevejde 2x. A ten zbytek po celočíselném dělení bude v tomto případě 1. Protože to zaokrouhlené číslo (tedy 2) vynásobíme číslem, kterým jsme dělili (tedy 2) a tento výsledek (tedy 4) odečteme od čísla, které jsme dělili (tedy 5).

Příklady:

$a = 10 % 7;

Proměnná $a bude mít nyní hodnotu 3.

Protože:

10 / 7 = 1.42857142857142857…

výsledek zaokrouhlíme dolu na celé číslo = 1

vynásobíme: 7 * 1 = 7

a odečteme: 10 – 7 = 3

výsledek je tedy 3.

Další příklad:

$a = 10 % 5;

Proměnná $a bude mít hodnotu 0.

Protože:

10 / 5 = 2

výsledek zaokrouhlovat nemusíme, protože už je sám o sobě celým číslem = 2

dál už bychom pokračovat nemuseli, protože pokud je výsledkem rovnou celé číslo, je zbytek po celočíselném dělení vždy 0, ale pro jistotu:

vynásobíme: 5 * 2 = 10

a odečteme: 10 – 10 = 0

výsledek je tedy 0.

No vidíte, jak by ten výpočet byl zbytečně složitý. Proto máme operátor ‘%’ (modulo), který nám v tomto případě usnadní práci :)

Operátor inkrementace a dekrementace

Inkrementace ‘++’ (dvě znaménka + za sebou), zvýší hodnotu proměnné o 1.

$a = 5;

 

$a++;

V proměnné $a bude nyní hodnota 6, protože je to stejné, jako kdybychom napsali:

$a = $a + 1;

Uznejte, že zápis ‘$a++;’ je kratší.

Stejně tak dekrementace ‘–’ (dvě znaménka – za sebou), sníží hodnotu proměnné o 1.

$a = 5;

 

$a--;

V proměnné $a bude nyní hodnota 4, protože je to stejné, jako kdybychom napsali:

$a = $a - 1;

Operátor spojování řetězců

Pro spojování řetězců v PHP se používá operátor ‘.’ (tečka). Tečka má určitě své výhody oproti znaménku ‘+’, které se používá pro spojování řetězců například v JavaScriptu. Je totiž hned zřejmé, co chceme s hodnotami provést, zda sčítání nebo spojení řetězců.

$c = "Ahoj " . "Marku";

V proměnné $c bude text ‘Ahoj Marku’.

$a = "5";

 

$b = "2";

 

$c = $a + $b;

V proměnné $c bude teď 7 i přesto, že v proměnných $a$b, byl vlastně uložen textový řetězec (hodnota byla v uvozovkách). PHP podle operátoru sčítání poznalo, že hodnoty chceme sečíst, což ale s textem jaksi provést nelze, tak obě hodnoty automaticky přetypoval na číselné.

$c = $a . $b;

Teď je v proměnné $c text ’52′.

Co by se ale stalo, pokud:

$a = "Ahoj";

 

$b = 2;

 

$c = $a + $b;

V proměnné $c bude nyní číslo 2. Protože proměnná $a není číslo, tedy má číselnou hodnotu 0, a 0+2=2.

Porovnávací operátory

Jak již název napovídá, tyto operátory slouží pro porovnávání hodnot. Nejčastěji se používají v růzých podmínkách a cyklech.

==rovnost (vrací true, pokud mají oba operandy stejnou hodnotu)
!=nerovnost (vrací true, pokud mají operandy různou hodnotu)
<>nerovnost (stejně jako !=)
<menší než (vrací true, pokud operand na levé straně má menší hodnotu než operand na straně pravé)
>větší než (vrací true, pokud operand na levé straně má větší hodnotu než operand na straně pravé)
<=menší než nebo rovno (vrací true,pokud mají oba operandy stejnou hodnotu nebo operand na levé straně má menší hodnotu než operand na straně pravé)
>=větší než nebo rovno (vrací true, pokud mají oba operandy stejnou hodnotu nebo operand na levé straně má větší hodnotu než operand na straně pravé)
V PHP od verze 4 byly přidány ještě další dva, které navíc porovnávají, zda jsou obě hodnoty i stejného datového typu
===vrací true, pokud oba operandy mají stejnou hodnotu a jsou stejného datového typu
!==vrací true, pokud oba operandy mají různou hodnotu nebo jsou různého datového typu

Pár příkladů:

$a = 1;

 

$b = 1.0;

 

$c = $a==$b;

Proměnná $c má hodnotu true, protože proměnné $a$b mají stejnou hodnotu.

$c = $a===$b;

$c je teď false, protože $a$b mají sice stejnou hodnotu, ale nejsou stejného datového typu – $a je číslo celé, $b je číslo s desetinnou čárkou.

$c = $a!=$b;

false, protože proměnné mají stejnou hodnotu.

$c = $a!==$b;

true, protože proměnné mají sice stejnou hodnotu, ale nejsou stejného datového typu.

Logické operátory

V PHP (od verze 4), stejně jako asi ve většině programovacích jazyků existuje datový typ boolean. Ten má pouze dvě hodnoty a to: logická pravda (true) a logická nepravda (false). Co to je:

Jako nepravda (tedy false) je vyhodnocena hodnota 0, jakýkoliv prázdný řetězec, prázdné pole neboprázdný objekt, řetězec obsahující pouze znak 0 a hodnota null.

Všechno ostatní je vyhodnoceno jako pravda (tedy true) – neprázdný řetězec, jakékoliv číslo různé od nuly (tedy i záporné) atd.

Negace

Negace je operátor, který obrátí booleovskou hodnotu výrazu. Takže z true udělá false a naopak. Používá se zápisem ‘!’ před hodnotou.

Napsali-li bychom příklad z porovnávacích operátorů takto:

$a = 1;

 

$b = 1.0;

 

$c = !($a==$b);

bude mít proměnná $c hodnotu false, protože jak víme z matematiky: co je v závorce, má při výpočtech přednost, takže se nejprve výraz v závorkách vyhodnotí jako true a poté se pomocí operátoru ‘!’ hodnota obrátí, takže výsledkem je false.

Konjunkce

Pokud bychom potřebovali, aby dvě nebo více podmínek platilo zároveň, můžeme použít logický operátor konjunkce. Ten se zapisuje buď jako ‘and‘ nebo jako ‘&&‘. Rozdíl mezi těmito dvěma způsoby zápisu je v prioritě operátorů (prioritu jednotlivých operátorů si ukážeme na konci tohoto článku).

Příklad:

$x = (($a == 10) and ($b > 0));

 

$x = ($a == 10) && ($b > 0);

Obě tyto podmínky jsou funkčně naprosto stejné. Proměnná $x bude mít hodnotu true pouze v případě, že proměnná $a má hodnotu 10 a zároveň proměnná $b má větší hodnotu než 0. Ovšem jistě jste si všimli závorek navíc na prvním řádku. Ty jsou tam proto, že operátor ‘and‘ má nižší prioritu než operátor ‘=‘ (přiřazení).

Vyhodnocování logických operátorů v PHP probíhá zkráceně. To znamená, že pokud by v předchozím příkladu byla již první podmínka ($a == 10) vyhodnocena jako nepravdivá, druhá podmínka ($b > 0) se již vyhodnocovat nebude, protože výsledek už bude vždy false i kdyby druhá podmínka byla true.

Disjunkce

Pokud potřebujeme, aby paltila alespoň jedna podmínka ze dvou nebo více, použijeme operátor disjunkce. Ten se zapisuje jako ‘or‘ (nebo) nebo jako ‘||‘. Opět se tyto dva zápisy liší prioritou.

Příklad:

$x = (($a == 10) or ($b > 0));

 

$x = ($a == 10) || ($b > 0);

Proměnná $x bude true, pokud alespoň jedna z podmínek bude pravdivá (true). I v případě, že budou pravdivé obě podmínky, bude výsledkem true. Jedině v pokud budou obě podmínky nepravdivé, bude výsledkem false.

I zde platí, že se výraz vyhodnocuje zkráceně, což znamená, že když bude první podmínka true, druhá podmínka se již vyhodnocovat nebude, protože výsledek bude vždy true, i kdyby druhá podmínka bylafalse.

Exklusivní disjunkce

U operátoru disjunkce výraz vracel true v případě, že byla pravdivá alespoň jedna z podmínek, nebo byly pravdivé obě. To je rozdíl oproti operátoru exklusivní disjunkce, který vrací true pouze v případě, že je pravdivá pouze jedna z podmínek. Pokud budou pravdivé obě, vrátí výraz false, stejně jako když nebude pravdivá ani jedna. Tento operátor se zapisuje jako ‘xor‘.

Příklad:

$x = (($a == 10) xor ($b > 0));

Výsledek výrazu bude true pouze v případě, že $a bude mít hodnotu 10$b nebude větší než 0, nebo pokud $a bude mít jinou hodnotu než 10$b bude větší než 0. Ve všech ostatních případech bude výsledek false.

Bitové operátory

Upozorňuji, že tyto operátory jsem osobně nikdy nepoužil a ani jsem se jimi nikdy nezabýval, takže s nimi nemám žádné zkušenosti. Proto Vám je tu pouze vypíšu:

&nastaví ve výsledku ty bity, které jsou nastavené zároveň v obou operandech
|nastaví ve výsledku ty bity, které jsou nastavené alespoň v jednom z operandů
ˆnastaví ve výsledku ty bity, které jsou nastavené právě v jednom z operandů
˜nastaví ve výsledku ty bity, které v operandu nastaveny nejsou a naopak
<<bity levého operandu posune vpravo o počet bitů zadaných ve druhém argumentu
>>bity levého operandu posune vlevo o počet bitů zadaných ve druhém argumentu

Složené operátory

Toto jsou operátory, které se zapisují jako operátor přiřazení, před který se vloží některý jiný operátor.

Například:

$a = 5;

 

$a += 5;

Proměnná $a má nyní hodnotu 10. Je to totiž to samé, jako bychom napsali:

$a = $a + 5;

Několik ukázek:

$a -= 2;               //stejné jako $a = $a - 2
$a *= 2;               //stejné jako $a = $a * 2
$a /= 2;               //stejné jako $a = $a / 2
$a %= 2;               //stejné jako $a = $a % 2
$a .= "nějaký text";   //stejné jako $a = $a . "nějaký text"

Podmíněný operátor

Tohle je poněkud zvláštní operátor, jako jediný totiž používá tři argumenty. Prvním je podmínka, která se má vyhodnotit, druhý je příkaz, který se má provést, pokud je podmínka pravdivá (true) a třetí je příkaz, který se provede, je-li podmínka nepravdivá. Zapsat by se to dalo nějak takto:

podmínka ? příkaz1 : příkaz2;

Jeden příklad:

echo ($a == 0) ? "a má hodnotu 0" : "a má jinou hodnotu než 0";

Pokud bude mít proměnná $a hodnotu 0, vypíše se text ‘a má hodnotu 0‘, jinak se vypíše ‘a má jinou hodnotu než 0‘.

Tak, operátory jsme si snad vypsali všechny, teď si ještě napíšeme, jak je to s tou prioritou.

Priorita operátorů

Tak schválně, jaký bude výsledek tohoto příkladu?

2 + 3 * 2

Někdo hádal 10? Ne, všichni jste určitě spočítali, že 8. Aby nám vyšlo 10, museli bychom to napsat takto:

(2 + 3) * 2

Ano, i v matematice existuje priorita operátorů, násobení a dělení má přednost před sčítáním a odečítáním. Stejně tak je tomu v programovacích jazycích včetně PHP. Na následujících řádcích jsou vypsány operátory podle priority. Jejich priorita klesá od shora dolů, tedy ty napsané na prvním řádku mají nejvyšší prioritu, na posledním řádku jsou operátory s nejnižší prioritou:

! ˜ ++ --

* / %

+ - .<< >>

< <= > >=

= != <> === !==

&

ˆ

|

&&

||

?:

= += -= *= /= .= %= &= |= ˆ= <<= >>=

and

xor

or

Ale stejně jako v matematice, i tady se dá priorita jednotlivých operátorů ve složitějších výrazech obejít pomocí závorek. To co je v závorkách, se totiž vždy vyhodnocuje přednostně. Osobně používám závorky ve všech podmínkách, místo toho, abych musel pokaždé přemýšlet, který operátor má před kterým přednost a tedy která část podmínky se vyhodnotí jako první.

Tímto by bylo povídání o operátorech skončeno a příště se podíváme na funkce.

REKLAMA

PHP výuka - operátory