15. Fejezet. Operátorok

Tartalom
Operátorok precedenciája
Aritmetikai operátorok
Hozzárendelő operátorok
Bitorientált operátorok
Összehasonlító operátorok
Hibakezelő operátorok
Végrehajtó operátorok
Növelő/csökkentő operátorok
Logikai operátorok
String operátorok
Tömb operátorok
Típus operátorok

Az operátor egy olyan dolog, aminek adsz egy vagy több értéket (vagy szakmai nyelven: kifejezést), ami kiad egy másik értéket (úgy hogy a kapott konstrukció kifejezéssé alakuljon). Tehát úgy gondolhatsz a függvényekre és az olyan konstrukciókra, amelyek értéket adnak vissza (pl. print), mint operátorok, azokra pedig, amelyek nem adnak vissza semmit (pl. echo), mint valami másféle dolgokra.

Három féle operátor létezik. Az első fajta operátor az unáris, amely csak egy értékkel dolgozik, például a ! (a negációs operátor) vagy ++ (a növelő operátor). A második csoportot a bináris operátorok képviselik; ez a csoport foglalja magába a PHP által nyújtott operátorok közül a legtöbbet, találsz ezekről egy listát lejjebb az Operátorok precedenciája című részben.

A harmadik kategória a ternáris operátoré: ?:. Ezt arra érdemes használni, hogy válasszunk két kifejezés közül egy harmadik kifejezéstől függően, inkább mintsem két mondat vagy két végrehajtási út között. A ternáris kifejezések bezárójelezése igen jó ötlet.

Operátorok precedenciája

Az operátorok precedenciája azt határozza meg, hogy milyen "szorosan" köt össze két kifejezést. Például az 1 + 5 * 3 kifejezésben, a kifejezés értéke 16, és nem 18, mert a szorzás operátorának, a ("*")-nak nagyobb precedenciája van, mint az összeadásénak ("+"). Zárójelek segítségével tetszőleges precedenciát lehet felállítani egy kifejezésen belül, ha szükséges. Például a (1 + 5) * 3 eredménye 18 lesz.

Az alábbi táblázat az operátorokat precedenciájuk szerint csökkenő sorrendben tartalmazza.

Táblázat 15-1. Operátorok precedenciája

asszociativitásoperátorok
nem köthetőnew
jobbról balra[
nem köthető++ --
nem köthető! ~ - (int) (float) (string) (array) (object) @
balról jobbra* / %
balról jobbra+ - .
balról jobbra<< >>
nem köthető< <= > >=
nem köthető== != === !==
balról jobbra&
balról jobbra^
balról jobbra|
balról jobbra&&
balról jobbra||
balról jobbra? :
jobbról balra = += -= *= /= .= %= &= |= ^= <<= >>=
balról jobbraand
balról jobbraxor
balról jobbraor
balról jobbra,

[Az asszociativitás talán megér egy kis magyarázatot. Ez azt határozza meg, hogy az adott szinten levő operátorok egymás utáni, zárójel nélküli használatát hogyan értelmezi a fordító. Egy példán keresztül talán érthetőbbé válik: 1-2+3 értelmezhető (1-2)+3-nak (= 2), vagy 1-(2+3)-nak (= -4). Az előbbi kiértékelés, amely balról jobbra asszociatív, a helyes ebben az esetben. A második kiértékelés pedig jobbról balra asszociatív - ilyen lenne például a hatványozás, amely nincs a nyelvben implementálva (erre szolgál pow()). Ha a ** lenne a hatványozás, akkor a 2**3**2 helyesen 2 a 9-en = 512 lenne. Vannak nem köthető (nem asszociatív) operátorok is, ilyenek az összehasonlító operátorok. A PHP-ban tehát nem értelmes a 2<$x<4 kifejezés.]

A balról jobbra asszociativitás azt jelenti, hogy a kifejezés kiértékelése balról jobbra történik, a jobbról balra pedig ennek az fordítottját.

Példa 15-1. Asszociativitás

<?php
$a
= 3 * 3 % 5; // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2

$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
?>
Használj zárójeleket, hogy olvashatóbb legyen a kódod!

Megjegyzés: Annak ellenére, hogy a ! operátornak nagyobb a precedenciája, mint a = operátornak, a PHP elfogadja az ehhez hasonló kifejezéseket is: if (!$a = ize()), ebben az esetben az ize() által visszaadott érték $a-ba kerül bele.