Kapitola 10. Výrazy
Výrazy jsou nejdůležitějšími stavebními kameny PHP. V PHP je téměř vše,
co napíšete, výraz. Nejjednodušší, a přece nejpřesnější definicí výrazu je
"všechno, co má hodnotu".
Nejzákladnějšími formami výrazů jsou konstanty a proměnné. Když napíšete
"$a = 5", přiřazujete '5' do $a. '5' má, pochopitelně, hodnotu 5, nebo
jinými slovy, '5' je výraz s hodnotou 5 (v tomto případě je '5'
celočíselnou konstantou).
Po tomto přiřazení budete očekávat, že hodnota $a bude 5, takže kdybyste
napsali $b = $a, očekávali byste totéž, jako při napsání $b = 5. Jinými
slovy, $a je tedy výraz s hodnotou 5. Pokud vše pracuje správně,
přesně to se také stane.
O něco složitějším příkladem výrazů jsou funkce. Uvažujme např. tuto
funkci:
Za předpokladu, že jste dobře seznámeni s konceptem funkcí (pokud ne,
nahlédněte do kapitoly o funkcích), byste předpokládali, že napsání
$c = foo() je v zásadě totéž jako
$c = 5, a máte pravdu. Funkce jsou výrazy s hodnotou
jejich návratové hodnoty. Funkce foo() vrací 5, tudíž hodnota výrazu
'foo()' je 5. Obvykle funkce nevracejí konstantní hodnotu, nýbrž něco
vypočítávají.
Hodnoty v PHP samozřejmě nemusejí být pouze celá čísla, a velmi často
také nejsou. PHP podporuje tři typy skalárních hodnot: celočíselné,
reálné (pohyblivá řádová čárka) a řetězce (skalární hodnoty jsou hodnoty,
které nejde "rozbít" na menší části, narozdíl např. od polí). PHP
podporuje také dva kompozitní (neskalární) typy: pole a objekty. Každý
z těchto typů hodnot může být přiřazen do proměnné nebo vracen z funkce.
Uživatelé PHP/FI 2 by neměli pocítit změnu. Ale PHP jde ve výrazech
mnohem dále, stejně jako mnoho jiných programovacích jazyků. PHP je
výrazově orientovaný jazyk, ve smyslu, že téměř vše je výraz. Uvažujme
příklad, kterým jsme se již zabývali, '$a = 5'. Ihned vidíme, že jsou
zde zahrnuty dvě hodnoty, celočíselná konstanta '5' a hodnota $a,
která je aktualizována na 5. Ale je pravda, že je tu ještě jedna hodnota,
je to hodnota samotného přiřazení. Přiřazení jako takové ohodnocuje
přiřazovanou hodnotu, v tomto případě 5. V praxi to znamená, že '$a = 5',
bez ohledu na to co dělá, je výraz s hodnotou 5. Proto je '$b = ($a = 5)'
totéž jako '$a = 5; $b = 5;' (středník označuje konec výrazu). Protože
přiřezení jsou parsována zprava doleva, můžete také napsat
'$b = $a = 5'.
Jiným dobrým příkladem orientace na výrazy je pre- a post-inkrementace
a dekrementace. Uživatelé PHP/FI 2 a mnoha jiných jazyků znají notaci
proměnná++ a proměnná--. To jsou inkrementační a dekrementační operátory.
V PHP/FI 2 nemělo '$a++' žádnou hodnotu (není to výraz), a proto nešlo
přiřadit nebo jinak použít. PHP rozšiřuje schopnosti přeměnou těchto
konstrukcí ve výrazy, jako v C. V PHP, stejně jako v C, existují dva typy
inkrementace - pre-inkrementace a post-inkrementace. Oba ve své podstatě
inkrementují proměnnou a efekt na tuto proměnnou je totožný. Rozdíl je
v hodnotě inkrementačního výrazu. Pre-inkrementace, zapsaná jako
'++$var', ohodnocuje výraz inkrementovanou hodnotou (PHP inkrementuje
proměnnou dříve, než přečte její hodnotu, proto "pre-inkrementace").
Post-inkrementace, zapsaná jako '$var++', ohodnocuje výraz původní
hodnotou proměnné $var, před inkrementací (PHP inkrementuje proměnnou
po přečtení její hodnoty, proto "post-inkrement").
Velmi častým typem výrazů jsou výrazy porovnávací. Tyto výrazy se
ohodnocují 0 a 1 ve významu FALSE, resp. TRUE. PHP podporuje
> (větší než), >= (větší nebo rovno), == (rovná se), != (nerovná se),
< (menší než) a <= (menší nebo rovno). Tyto výrazy se nejčastěji
používají v podmínkách, jako je konstrukt if.
Posledním příkladem výrazů, kterým se budeme zabývat, je kombinací
přiřazení a operátorů. Již víte, že když chcete inkrementovat $a o
jedničku, jednoduše napíšete '$a++' nebo '++$a'. Ale co když chcete
hodnotu zvýšit o jiné číslo, např. o 3? Mohli byste napsat '$a++'
víckrát za sebou, ale to samozřejmě není efektivní ani pohodlné.
Mnohem praktičtější je napsat '$a = $a + 3'. Výraz '$a + 3' ohodnocuje
hodnotu $a plus 3 a je přiřazen zpět do $a, což dává $a inkrementované
o 3. V PHP, stejně jako v řadě jiných jazyků (jako je C), to můžete
napsat kratším způsobem, který se časem stane jasnější i rychlejší
k pochopení. Přičtení 3 k aktuální hodnotě $a lze zapsat jako '$a += 3'.
Přesně to znamená "vezmi hodnotu $a, přičti k ní 3 a přiřaď zpět do $a".
Kromě kratšího a přehlednějšího zápisu je výhodou také rychlejší provedení.
Hodnota '$a += 3', jako hodnota regulérního přiřazení, je přiřazovaná
hodnota. Uvědomte si, že to NENÍ 3, nýbrž $a plus 3 (což je hodnota
výrazu přiřazovaného do $a). Takto lze použít jakýkoli binární operátor,
například '$a -= 5' (odečti 5 od hodnoty $a), '$b *= 7' (vynásob hodnotu
$b číslem 7) apod.
Je tu ještě jeden výraz, který se může zdát zvláštní, pokud jste ho
ještě neviděli v jiných jazycích: ternární podmíněný operátor:
Pokud hodnota prvního podvýrazu je
TRUE (nenulová), je ohodnocen druhý
podvýraz a je výsledkem celého podmíněného výrazu. Jinak je ohodnocen
třetí podvýraz a je pak hodotou celého výrazu.
Následující příklad by měl pomoci lépe pochopit pre- a post-inkrementaci
i výrazy obecně:
Na začátku kapitoly bylo řečeno, že si popíšeme různé typy konstruktů,
a jak bylo slíbeno, výrazy mohou být konstrukty. V tomto případě mají
konstrukty formát 'expr' ';', což znamená "výraz následovaný středníkem.
V konstruktu '$b=$a=5;', je $a=5 platný výraz, ale samo o sobě to není
konstrukt.'$b=$a=5;' je i platný konstrukt.
Pozn. překladatele: Předchozím odstavci (občas i jinde) používám termín
"konstrukt" pro anglické slovo "statement". Tento překlad není příliš
korektní, ale v české programátorské mluvě neexistuje vhodný termín.
Kdyby někdo věděl o lepším, napište mi, prosím, na luk@php.net.
Poslední věcí, která si zaslouží zmínku, je pravdivostní hodnota výrazů.
V mnoha případech, hlavně podmínkách a cyklech, vás nezajímá konkrétní
hodnota výrazu, nýbrž pouze to, jestli je TRUE nebo FALSE.
Konstanty TRUE a FALSE (malá/velká písmena nehrají roli) představují
dvě možné boolovské (pravdivostní) hodnoty. V případě potřeby je výraz
automaticky převeden na typ boolean. Detailnější informace o způsobu
konverze - viz
sekce o typové konverzi.
PHP poskytuje plnou a silnou implementaci výrazů a úplně je zdokumentovat
přesahuje rozsah tohoto manuálu. Výše uvedené příklady by vám měli
naznačit, co jsou vůbec výrazy a jak konstruovat užitečné výrazy. Ve
zbývající části manuálu budeme psát expr
jakožto jakýkoli platný PHP výraz.