Programozás közben szinte elkerülhetetlen az a forgatókönyv, amikor egy szám típusú változó értékét növelnünk vagy csökkentenünk kell. A növelést "++", a csökkentést pedig "--" operátorokkal érhetjük el. Ilyenkor a változó értéke eggyel növekszik vagy csökken.
Attól függően, hogy az operátort a változó elé vagy mögé írjuk, két különböző viselkedést tapasztalhatunk: az elé írt operátorral (++$szam) előzetes értéknövelés történik (a $szam értéke eggyel növekszik, majd visszatér a $szam új értékével), a mögé írttal pedig ($szam++) először visszatér az értékkel, majd utána növeli:
-----------------------
<?php
$szam_a = 1;
$szam_b = 2;
echo ' $szam_a: ';
echo $szam_a++; // Kiírja: 1 (mivel az értéknövelés csak a kiírás után történik)
echo ' $szam_b: ';
echo ++$szam_b; // Kiírja: 3 (itt az értéknövelés már a kiírás előtt megtörtént)
?>
-----------------------
Érdekesség
Mi történik, ha egy stringet növelünk? Hasonlóan a Perl nyelvhez, a PHP is az a-z, A-Z és 0-9 tartományokat támogatja, valamint csak a növelés operátor működik. Ha az "a" értékű változót növeljük, az eredmény "b" lesz (mindig a soron következő karakter), ha eléri a lista végét (pl. "z"), akkor eggyel arrébb csúsztatja, és kezdi elölről: "z" után "aa" jön, "aa" után "ab", stb.
-----------------------
<?php
$szoveg = 'a';
echo ' $szoveg: ';
echo ++$szoveg; // Kiírja: b (mivel az értéknövelés megtörtént)
?>
-----------------------
Figyeljük meg az alábbi példát! Habár azt várnánk, hogy a fenti módszerrel a '01' értékű változó növelt értéke '02' lesz, ez nem így van: a PHP automatikusan számként fogja értelmezni, és '2' lesz az eredmény. Ezt ellenőrizhetjük a var_dump segítségével:
-----------------------
<?php
$szoveg = '01';
echo var_dump($szoveg); // vizsgálat: itt még string!
echo ' $szoveg: ';
echo ++$szoveg; // Kiírja: 2 (habár azt várnánk el, hogy '02' legyen az eredmény!)
echo ' ';
echo var_dump($szoveg); // újbóli vizsgálat: itt már integer!
?>
-----------------------
A fenti eset miatt nagyon óvatosan bánjunk az értéknövelt stringekkel, mert elképzelhető, hogy meglepetést okozhat az eredmény. Ez is egy jó példa a gyenge típusosság (amikor egy változó típust válthat művelet közben) csapdájára.
Figyelem!
Habár a $szam += 1 forma azonos hatást produkál a ++$szam formával, a mérések alapján az első gyorsabb. Továbbá a ++$szam gyorsabb és kevesebb memóriát foglal, mint a $szam++. Ha tehetjük, és a programunk logikája megengedi, használjuk az első alakot!
Mi történik, ha a változót nem hoztuk létre, és úgy növeljük? Habár azt várnánk, hogy legalább egy figyelmeztetést kapunk majd, ez nem történik meg, hanem 0 értékkel létrejön a változó, majd megtörténik az értékváltoztatás.
-----------------------
<?php
echo ++$valtozo; // Kiírja: 1 (hibajelzés nélkül létrejön a változó 0 értékkel, majd növeli eggyel)
?>
-----------------------
Láthatjuk, hogy az egyszerűnek tűnő operátor mennyire változatosan tud viselkedni. A váratlan eredmények elkerülése érdekében gondoljuk át jól, hogy mit is akarunk elérni az alkalmazásukkal!
----------------------------------------------
Feladatok
1. Hozzunk létre két változót, az egyik értékét növeljük eggyel, majd az értéknövelt változóból vonjuk le a második változó értékét!
2. Egy string típusú változót növeljünk, majd írjuk ki az eredményt!
3. Vizsgáljuk meg egy változó előzetes és utólagos értéknövelését, valamint értékcsökkentését!