Kapitola 9. 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:

function foo ()
{
    return 5;
}

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:

$prvni ? $druhy : $treti

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

function double($i)
{
    return $i*2;
}
$b = $a = 5;        /* p°i°a∩ hodnotu p∞t do prom∞nn²ch $a a $b */
$c = $a++;          /* prove∩ post-inkrement, p°i°a∩ p∙vodnφ hodnotu $a 
                       (5) do $c */
$e = $d = ++$b;     /* prove∩ pre-inkrement, p°i°a∩ inkrementovanou hodnotu 
                       $b (6) do $d a $e */

/* nynφ jsou hodnoty prom∞nn²ch $d a $e rovny 6 */

$f = double($d++);  /* p°i°a∩ dvakrßt hodnotu $d <emphasis>p°ed</emphasis> 
                       inkrementacφ, 2*6 = 12, do $f */
$g = double(++$e);  /* p°i°a∩ dvakrßt hodnotu $e <emphasis>po</emphasis>
                       inkrementaci, 2*7 = 14 do $g */
$h = $g += 10;      /* nejd°φve je $g inkrementovßno o 10 mß pak hodnotu 24. 
                       Hodnota p°i°azenφ (24) se p°i°adφ do $h a $h tφm
                       zφskßvß takΘ hodnotu 24. */

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.