9. Fejezet. Kifejezések

A kifejezések a PHP legfontosabb építőkövei. A PHP-ban minden, amit leírsz, egy kifejezés. A lehető legegyszerűbb és még pontos definíciója a kifejezésnek: "valami, aminek értéke van".

A kifejezések legalapvetőbb formái a konstansok és változók. Amikor beírod, hogy "$a = 5", az '5'-öt az $a változóhoz rendeled. Az '5'-nek nyilván 5 az értéke, vagy más szavakkal az '5' egy olyan kifejezés, melynek értéke 5 (itt az '5' egy egész konstans).

Ez után a hozzárendelés után azt várod, hogy $a értéke 5 legyen, sőt, ha azt írod, hogy $b = $a, azt várod, hogy az eredmény legyen azonos azzal, mintha $b = 5-öt írtál volna. Más szavakkal az $a egy kifejezés, melynek értéke 5. Ha minden jól megy, pontosan ez fog történni.

Kissé bonyolultabb példák a kifejezésekre a függvények. Például tekintsük az alábbi függvényt:

  1 
  2 
  3 function foo () {
  4     return 5;
  5 }
  6 
  7      

Feltéve, hogy nem idegen tőled a függvények koncepciója (ha nem, akkor olvasd el a függvényekről szóló fejezetet), azt várnád, hogy $c = foo() lényegében azonos $c = 5 beírásával és igazad is van. A függvények olyan kifejezések, amiknek az értéke a visszatérési értékük. Mivel foo() 5-tel tér vissza, a 'foo()' kifejezés értéke 5. Általában a függvényeket nem arra használjuk, hogy egy bedrótozott számmal térjenek vissza, hanem azért, hogy valamit kiszámoljanak.

Természetesen a változóknak a PHP-ben nem kell egésznek lenniük, és nagyon gyakran nem is azok. A PHP három féle skalártípust támogat: egész, lebegőpontos és string értékeket (skalárnak az számít, amit nem lehet kisebb darabokra bontani, nem úgy, mint a tömböket, például). A PHP két nem skalár típust is támogat: a tömb és objektum típust. Mindegyikükhöz lehet értéket rendelni, és mindegyikük lehet egy függvény visszatérési értéke.

Eddig, a PHP/FI 2 használói nem találkoztak semmi különössel. Mindamellett a PHP továbbviszi a kifejezéseket, úgy mint azt sok hasonló nyelv teszi. A PHP egy kifejezés-orientált nyelv, olyan szempontból, hogy majdnem minden kifejezés. Tekintsük a példát, amivel foglalkoztunk, '$a = 5'. Látható, hogy két értéket hívtunk meg, az egész konstans '5'-öt, és $a értékét, amit az 5 értékkel frissítettünk. De az az igazság, hogy még egy érték is van a kifejezésben, a hozzárendelés maga. A hozzárendelés maga kiértékeli az átadandó értéket, ebben az esetben az 5-öt. Gyakorlatilag ez azt jelenti, hogy '$a=5', eltekintve attól, hogy mit csinál, egy kifejezés, aminek az értéke 5. Ezért ha olyasmit írunk, hogy '$b=($a=5)', az olyasmi, mintha azt írtuk volna, hogy '$a=5; $b=5;' (a pontosvessző jelöli az állítás végét). Mivel a hozzárendelés jobbról balra történik, ez ír6ó zárójelek nélkül is: '$b=$a=5'.

A kifejezés-orientáltság másik jó példája a pre- és postinkrementáció. A PHP/FI 2 használóinak és sok más nyelvet használónak ismerős lehet a változó++ és változó-- jelölés. Ezek az inkrementáló és dekrementáló operátorok. A PHP/FI 2-ben a '$a++'-nek nincs értéke (mert nem kifejezés), és ezért nem is lehet semmihez hozzárendelni, vagy valamire használni. A PHP kiterjesztette az inkrementálás/dekrementálás lehetőségeit azzal, hogy ezeket is kifejezésekké alakította, mint ahogyan a C nyelvben is megtették. A PHP-ben a C nyelvhez hasonlóan kétféle inkrementáció van: pre- és post. Mindkettő megnöveli a változó értékét, tehát a változó szempontjából nézve nincs különbség, a kifejezés értékében annál inkább. A pre-inkrementáció, amit '++$változó'-ként írunk, a növelt értéket adja (A PHP először növeli a változót, majd kiértékeli, innen a 'pre-'). A post-inkrementáció '$változó++' az eredeti értéket adja (A PHP először kiértékeli, aztán növeli a változót, innen a 'post-'). [a dekrementációval ugyanez a helyzet, értelemszerűen]

A kifejezések egy gyakori típusai az összehasonlító kifejezések. Ezek a kifejezések 0-t vagy 1-et adnak, annak megfelelően, hogy hamisak (FALSE), vagy igazak (TRUE) (ebben a sorrendben). A PHP támogatja a > (nagyobb), >= (nagyobb, vagy egyenlő), == (egyenlő), != (nem egyenlő), < (kisebb) és a <= (kisebb, vagy egyenlő) operátorokat. Ezeket a kifejezéseket általában feltételes kifejezésekben szokták használni. Ilyen pl. az if kifejezés.

Az utolsó példa, amivel itt foglalkozunk, a kombinált hozzárendelés-operátor kifejezés. [eredeti: combined operator-assignment fordícccsa le, aki akarja (tugggya)]. Lehet, hogy már tudod, hogy ha $a-t eggyel szeretnéd megnövelni, akkor egyszerűen írhatod, hogy '$a++' vagy '++$a'. [ha nem, akkor büntiből olvasd el ezt a fejezetet 10-szer eddig a pontig]. De mi van akkor, hogy ha nem eggyel, hanem 3-mal akarod megnövelni? Írhatod háromszor, hogy '$a++', de ez nem valami hatékony és üdvözítő megoldás. Egy sokkal jobb gyakorlat az '$a=$a+3'. Ez kiértékeli az $a plusz 3-at, és hozzárendeli az $a-hoz, aminek az lesz az eredménye, hogy $a megnő hárommal. De a PHP-ben, mint több más C-szerű nyelven egy rövidebb formában is írhatod [és mivel a programozó egyik fő tulajdonsága a lustaság, a türelmetlenség és az akaratosság mellett]: '$a+=3'. Ez pont azt jelenti, hogy "vedd $a értékét, és adjál hozzá hármat, és írd vissza az eredményt $a-ba". Amellett, hogy rövidebb és érthetőbb, még gyorsabb is. '$a+=3' értéke, mint egy normál értékadásé a hozzárendelt érték. Ez persze NEM 3, hanem $a plusz 3 (hiszen ezt az értéket rendeltük $a-hoz). Az összes többi kétoperandusú operátort lehet ilyenformán hozzárendelő-operátorként használni, például '$a-=5' (kivon 5-öt $a-ból), '$b*=7' (megszorozza $b-t 7-tel), stb.

Van még egy kifejezés, ami elég különösnek tűnhet, hacsak nem láttad más nyelvekben, a háromoperandusú feltételes operátor:

  1 
  2 $elso ? $masodik : $harmadik
  3     

Értéke: ha az első kifejezés értéke igaz (nem nulla), akkor a második rész-kifejezés, egyébként a harmadik részkifejezés. Egy segítő példa:

  1 
  2 $b = $todo == 'növel' ? $a+5 : $a-5; // $b $a+5 lesz, ha $todo értéke növel
  3                                    // egyébként $b $a-5 lesz
  4     

Ez ekvivalens az alábbi kóddal:

  1 
  2 if ($todo == 'növel') $b = $a+5 else $b = $a-5;
  3     

[Vigyázat!] Az alábbi példa segíthet a pre- és postinkrementálás, és a kifejezések jobb megértésében:

  1 
  2 function duplaz($i) {
  3     return $i*2;
  4 }
  5 $b = $a = 5;        /*ötöt rendelünk $a és $b változókhoz */
  6 
  7 $c = $a++;          /* post-inkrementálás, $c 5 lesz, mert
  8                        először $a kiértékelődik, csak aztán nő */
  9 
 10 $e = $d = ++$b;     /* pre-inkrementálás, $b növelt értéke (6)
 11                        adódik tovább $d-nek és $e-nek */
 12 
 13                     /* itt $d és $e hat */
 14 
 15 $f = duplaz($d++);  /* $d kétszeresének hozzárendelése mielőtt
 16                        inkrementálódik, 2*6 = 12 lesz $f */
 17 
 18 $g = duplaz(++$e);   /* $e kétszeresének hozzárendelése miután
 19                         inkrementálódik 2*7=14 lesz $g */
 20 
 21 $h = $g += 10;       /* először $g 10-zel nő, így 24 lesz az értéke,
 22                         ez adódik tovább $h-nak, az is 24 lesz*/
 23 

A fejezet elején azt ígértük, hogy leírjuk a különböző utasítás-típusokat, és ahogy reméljük, a kifejezések lehetnek állítások. De nem minden utasítás állítás. Így utasítás, ami 'kif' ';', vagyis egy kifejezés, amit pontosvessző követ. A '$b=$a=5;'-ben $a=5 érvényes kifejezés, de nem érvényes utasítás önmagában. A teljes '$b=$a=5;' már igen. [Gábor elmondta nekem, hogy: A lényeg, hogy az $a=5 nem utasítás, mivel nem követi ;]

Még egy említésre méltó dolog a kifejezések igaz értéke. Sok esetben főleg feltételes elágazásokban és ciklusokban, nem igazán érdekes, hogy a kifejezésnek mi az értéke, csak az, hogy igaz (TRUE) vagy hamis (FALSE) (a PHP-nak nincs külön boolean (logikai) típusa). Az igaz érték filozófiája hasonló a perléhez. Bármely nem-nulla értékű szám TRUE, a nulla pedig FALSE. Figyelj rá, hogy a negatív érték is nem-nulla, és így TRUE! Az üres string és a "0" string FALSE; minden más string TRUE. Nem skalár típusoknál (tömbök, objektumok) - ha az érték nem tartalmaz elemeket, FALSE, egyébként TRUE.

A PHP a kifejezések egy teljes és hatékony megvalósítását biztosítja, és teljes dokumentációja meghaladja e kézikönyv kereteit. A fenti példák rávilágítanak, hogy milyen állatfaj a kifejezés és hogyan kell létrehozni hasznos kifejezéseket. A kézikönyv hátralevő részében ahol azt írjuk, hogy expr akkor egy érvényes PHP kifejezést értünk.