Bár minden változónak van típusa, a nyelv csak gyengén típusos. A lehetséges típusok:
Skalárok:
Összetett típusok:
Speciális típusok:
A PHP-ben a 4-es változat előtt nem létezett a boolean típus. A régebbi változatokban is használhattuk a true értéket, de azt az értelmező egyszerűen integer típusú 1-re fordította. Az integer és float mérete gépfüggő, általában az int 32, a float pedig 64 bites. Az ezen túlcsorduló egészek automatikusan float-ra konvertálódnak.
PHP-ban kétféle lehetőségünk van sztringek megadására. Ha a szövegben változókat szeretnénk kiértékelni, akkor idézőjelek között adjuk meg a sztringet. A nyelv felismeri a változóneveket, lévén, hogy a speciális '$' karakterrel kezdődnek, és a szövegben behelyettesíti a változók neveit az aktuális értékükkel.
Ez tulajdonképpen megfelel egy konkatenálásnak is, amit a PHP automatikusan elvégez. Az előző példa egyenértékű ezzel:
Amennyiben a szöveget változatlan formában szeretnénk értékül adni, akkor használhatunk aposztrófokat idézőjelek helyett. Ekkor a közrefogott változók nem értékelődnek ki, egyszerű szövegként jelennek meg.
Szükség lehet a szöveg escape-elésére. A sztring tartalmazhat olyan karaktereket, amelyeknek speciális jelentésük van, így azok tévesen kerülnek lefordításra. Ilyen speciális szimbólumok pl.: $, ", ', \. A következő példa nem fog helyesen működni, mert a második aposztróf azt fogja jelenteni a fordítónak, hogy vége a sztringnek, így a szöveg további része hibaként jelenik meg.
Ennek kiküszöbölésére egy backslash (\) karaktert teszünk a speciális karakterek elé, hogy a fordító ne vegye figyelembe azokat.
Ugyanezt a módszert alkalmazhatjuk egyéb speciális karakterek beszúrásakor, mint pl.: \t, \n, \r. Ezek a whitespace karakterek csak idézőjelek között működnek, aposztrófok között nem.
A sztringekre semmilyen korlátozás nincs, ugyanúgy működnek az interpolációt és speciális karaktereket is beleértve, mint Perlben. Egyetlen fontos újítás, hogy itt a sztringet tekinthetjük byte-ok tömbjének is, ennek megfelelően hivatkozhatunk megfelelő indexekkel a betűkre. Így a sztring első betűje: $first = $str[0];. A sztring hosszát itt nem speciális változóként, hanem függvényhívással kaphatjuk meg: $last = $str[strlen($str)-1];.
Egy sztringet kezelhetünk úgy, mint egy tömböt, vagyis ha valamelyik karakterére szeretnénk hivatkozni, azt tömbökkel megtehetjük. Például:
A PHP fontosabb beépített függvényei sztringek kezelésére:
A PHP tömb a Perl-beli megfelelőjéhez hasonlóan működik, ám akadnak komolyabb különbségek.
A PHP szintakszisa tömb deklarálására:
Míg a Perlben két külön típus volt a tömb és a hasítótábla, a PHP nyelvben teljesen ugyanaz a két fogalom, ugyanis az index tetszőleges nem negatív egész szám, vagy szöveg is lehet, ráadásul ez akár egy tömbön belül is tetszőlegesen változhat. Ha nem adjuk meg előre a tömb indexeit, akkor 0-tól induló egész sorozat rendelődik hozzá. Az array nyelvi konstruktorral hozhatóak létre, vagy egyenként megadva az értékeit. Mérete tetszőlegesen változhat. Ha elhagyjuk az értékadásnál a tömbindexet, akkor automatikusan a tömb végére kerül az elem.
Bár szintaxisuk kicsit más, a Perlben megszokott függvények itt is rendelkezésre állnak, tudjuk a tömböt sorként, halmazként, veremként, stb kezelni. Írhatunk számokat is a szögletes zárójelbe, de ez nem tanácsos. Nézzük a következő programrészletet:
A tömbnek így mindössze két eleme van, de az utolsó elem indexe 200.
A PHP-ben további lehetőség, hogy a tömb elemei nem csak skalárok lehetnek, hanem bármi (tömbök, objektumok, stb).
Így könnyen készíthetünk különböző adatszerkezeteket (fa, gráf, miegyéb).
Tömböket kétféleképpen lehet létrehozni. Egyik a list(), másik az array() parancs.
A tömbök rugalmassága miatt nem mindig egyszerű feladat kideríteni, hány elem van a tömbben. A PHP a count() függvényt biztosítja erre a feladatra.
A count() a tömbben levő elemek számával tér vissza. Az alábbi programrészben egy számokkal indexelt tömböt hozunk létre,
majd a count() függvényt használjuk a tömb utolsó elemének elérésére.
De vannak esetek amikor a count() fv. nem célravezető:
A fenti kódot futtatva azt tapasztaljuk, hogy az "Az utolsó elem: " szöveg után semmi nem íródik ki. Ez azért van, mert a tömbnek nincs 1 indexű eleme. Az első elem a 0 indexen található, a második a 2 indexen, mivel az értékadáskor az indexet közvetlenül határoztuk meg.
A tömbök indexelése alapértelmezés szerint nullától indul, de ezt meg lehet változtatni. Ha azonban világos és következetes programokat szeretnénk írni, ne éljünk ezzel a lehetőséggel.
Példa tömb bejárására:
Lehetőség van a tömbelemek változtatására a bejárás során, ehhez azonban referencia szerint kell elérni a tömbelemeket, amit a '&' operátor használatával érhetük el.
Vigyázat! A referencia szerint átadott értékváltozóra a bejárás után mindig hívjuk meg az unset függvényt! A változó hatásköre nem csak a ciklusra vonatkozik, ezért ha az unset hívást elmulasztjuk, a változó továbbra is él és továbbra is a tömb utolsó elemére mutat. Például egy újabb, érték szerinti hivatkozást használó foreach ciklus nehezen felderíthető hibát okozhat.
Tömb bejárását kézileg is végezhetjük a beépített pointerek manipulálásával (ezek a reset, end, key, current, next). A következő példában azonban elakad a bejárás, amennyiben valamelyik elem pontosan FALSE értékű!
Alapértelmezetten a tömb 0-tól indexelődik, azonban mi tetszőleges egész számokkal és sztringekkel indexelhetjük a tömbünket. Példa:
Másképpen:
Mivel csak egészek és sztringek szerepelhetnek indexként, a további értékek a következőképpen konvertálódnak:
Az elemek a bekerülés sorrendjében szerepelnek a tömbben. Figyeljünk oda arra, hogy a nyelv nem figyelmeztet arra, ha egy tömb megadásakor egy elemmel felülírunk egy másikat. Például a következő tömb csak a 0 indexű "masodik" elemet fogja tartalmazni:
A PHP-ben fontos az asszociatív tömbök használata, ismerete, mivel az adatbázis rendszerek általában asszociatív tömbben adják vissza a lekérdezések eredményeit. (pl. mysql_fetch_array() függvény olyan asszociatív tömböt ír, amelyben a mezők nevei a kulcsok.)
Bonyolultabb programok esetében gyakran előfordul, hogy kíváncsiak vagyunk egy tömb vagy valamilyen más összetett változó tartalmára.
Ilyenkor általában nem kell saját tömblistázó kódot használnunk, hiszen a PHP
biztosítja számunkra a print_r() függvényt,
amely a paramétereként megadott változó tartalmát írja ki.
Fontos, hogy a PHP csak azokat a tömbelemeket menti el, amelyeket létrehoztunk, ezért már most mutatunk egy példát a tömb bejárására:
Példa asszociatív tömb bejárására:
Ahol csak mód van rá, ne használjunk tömbindexeket. A tömböket sokszor csak egyszerű listaként használjuk, ahol nem számít az, hogy egy adott elemnek mi az indexe. A PHP a tömbök elérésére a tömbindexek használatánál hatékonyabb és áttekinthetőbb függvényeket biztosít, programunk ezáltal rugalmasabb, könnyebben módosítható és jól olvasható lesz.
Mátrixokat is hozhatunk létre tömbök tömbje módszerrel, például többdimenziós indexelés $a[ ][ ] formában. A többdimenziós tömbök érdekessége, hogy minden implementáció egyedi, vagyis kétdimenziós tömbnek lehet az első dimenziója numerikusan indexelt, a második pedig asszociatív.
Példa többdimenziós tömb bejárására:
A PHP rengeteg függvénnyel segíti a tömbök feldolgozását is. A Perlben jártas olvasó bizonyára ismerősnek fogja találni ezen függvények nagy részét.
Mivel a PHP-ben gyengén típusosak, a változók típusa a program folyamán változhat, a Perlhez hasonlóan a változó típusát itt is a környezet határozza meg.
A szükséges típuskonverzió lehet automatikus:
Lehetőségünk van explicit konverzióra is, ezek egyik módja az ún. cast-olás, ez a C-s szintaktikát követi: $x = (új típus) $y;.
Használhatjuk a settype($var,"új típus); függvényt is:
A változó neve elé zárójelbe írt adattípus segítségével a változó értékének általunk meghatározott típusúvá alakított másolatát kapjuk. A lényegi különbség a settype() függvény és a típus-átalakítás között, hogy az átalakítás során az eredeti változó típusa és értéke változatlan marad, míg a settype() alkalmazása során az eredeti változó típusa és értéke az új adattípus értelmezési tartományához idomul. Az automatikus típuskonverzióra adható néhány érdekes példa is: '+' operátor esetén, ha az egyik operandus float, az eredmény is az lesz. Különben ha valamelyik integer, akkor az eredmény integer lesz.
Ha valamilyen skalárt tömbbé akarunk konvertálni, létrejön egy tömb, aminek első eleme a skalár. A tömb konverziója egyes esetekben nincs pontosan definiálva, mivel a nyelv definíciójából adódóan a következő probléma eldönthetetlen:
Ha egy skalárt objektumra konvertálunk, akkor létrejön egy objektum, melynek van egy scalar mezője:
A típusok közti konverzió meglepő eredményeket adhat, ha a konverzió egyébként sem magától értetődő.
Pl. egy tömb vagy egy objektum sztringre konvertálása "Array" illetve "Object" sztringet ad eredményül.
Hasonlóan zűrös esetekben inkább nézzünk meg egy nyelvi referenciát.
Sztringet egyszerűen numerikus kifejezéssé konvertálhatunk a következő szabályok alapján:
Egy numerikus adat érvényes, ha egy vagy több számjegy, opcionális tizedespont egy opcionális hatványkifejezésből áll.
A változók típusát lekérdezhetjük a gettype() függvénnyel:
A PHP-ben a változók:
Ha azt szeretnénk, hogy egy adott név alatt tárolt érték ne változzon a program futása során, létrehozhatunk állandókat (konstansokat) is.
Ezt a PHP beépített define() függvénye vagy const kulcsszó segítségével tehetjük meg.
Miután az állandót létrehoztuk, annak értékét nem szabad (nem tudjuk) megváltoztatni.
Az állandó nevét, mint karakterláncot és az értéket vesszővel elválasztva a zárójeleken belülre kell írnunk.
A konstansok nevének nem kell '$'-al kezdődniük, nem érvényesek rájuk a változókra vonatkozó láthatósági korlátozások,
valamint csak skaláris értéket tartalmazhatnak. Például:
PHP 5.3-ig a const kulcsszó nem volt használható a globális hatókörben, pusztán egy osztály adattagjának definíciójakor.
Ezt arra használtuk, hogy valamilyen konstans beállítást eszközöljünk az osztályra nézve, vagy valamilyen enum jellegű struktúrát
szeretnénk létrehozni, melyet a PHP nem támogat jelenleg. PHP 5.3-tól a const kulcsszó használható globális névtérben is.
A define kulcsszó ugyenezen okból kifolyólag használható, de pusztán globális hatókörben.
A PHP 5.6-tól const definíciójakor használható skalár-kifejezés, mely numerikus és string literálokat, vagy konstansokat tartalmazhat.
Az a szokás, hogy az állandók neve CSUPA NAGYBETŰBŐL áll.
Az összes előre definiált változó (és más hasznos információ) kilistázható a phpinfo() függvénnyel.
A PHP néhány beépített állandót automatikusan biztosít. Ilyen például a __FILE__, amely az értelmező által beolvasott fájl nevét tartalmazza.
A __LINE__ az aktuális sor számát tartalmazza. Ezek az állandók hibaüzeneteink kiírásánál hasznosak.
Az éppen használt PHP változatszámát többek között a PHP_VERSION állandóból tudhatjuk meg. Ez akkor lehet előnyös, ha egy program csak a PHP egy adott változatával futtatható.
Különbség az érték és a referencia szerinti átadásnál, hogy amíg az érték szerinti átadásnál bármilyen módosítás nem befolyásolja a másik változót,
a referencia szerinti átadásnál igen. Tehát ha $x=&$y és megváltoztatom x értékét ezzel y értékét is megváltoztatom, hiszen x y-ra hivatkozik!
A felhasználható előre definiált változók listája függ a szkript környezetétől (pl. webszerveren fut-e a PHP vagy esetleg különálló programként), a PHP verziószámától és a webszerver típusától.
Automatikusan rendelkezésre állnak minden hatáskörben (azaz: szuperglobálisak).
Egyidőben létezhet a szuperglobális és a HTTP_*_VARS tömb, de ezek nem azonosak, tehát az egyiknek a módosítása nem változtatja meg a másikat is.
A phpinfo() függvény segítségével listázhatjuk ki ezeket.
A fontosabb előre definiált változók:
Változó | Definició |
$GLOBALS | A globális változók nevei |
$_COOKIE | HTTP sütikből (cookies) származó változók |
$_GET | HTTP GET kérés által létrehozott változók |
$_POST | HTTP POST kérés által létrehozott változók |
$_SERVER | Változók, amelyeket a web-szerver állított be |
$_FILES | HTTP post fájlfeltöltés által létrejövő változók |
$_ENV | A környezetből származó változók |
$_REQUEST | HTTP GET, POST és COOKIE bemenetekből származó változók |
$_SESSION | A szkript munkamenetéhez rendelt változók |
Változó | Definició |
HTTP_HOST | A host tartalma: böngésző által küldött fejléc |
HTTP_USER_AGENT | A user agent tartalma: böngésző által küldött fejléc, ami az aktuális lapot lekérő böngészőre utal |
REMOTE_ADDR | Az aktuális lapot néző felhasználó IP címe |
SERVER_PROTOCOL | A használt protokoll neve és verziószáma |
GATEWAY_INTERFACE | CGI specifikáció száma, amelyet a szerver használ |
A Perllel ellentétben itt a változók nem láthatóak teljes élettartamukban, csak a saját blokkjukban. A függvényben használt változók az adott függvényre nézve helyiek maradnak. Más szavakkal: a változó a függvényen kívülről vagy más függvényekből nem lesz elérhető. Nagyobb projektek esetén ez megóvhat minket attól, hogy véletlenül két függvény felülírja azonos nevű változóik tartalmát.
A függvényen kívül meghatározott változó nem érhető el automatikusan a függvényen belülről. A külső blokkban látható változókat behozhatjuk blokkunkba a global kulcsszóval:
Vagy elérhetjük őket a $GLOBALS tömbön keresztül:
A függvénynek átadott paraméter általában valamilyen érték másolata, a paraméter megváltoztatásának a függvény vége után semmilyen hatása nincs.
Ha azonban egy globális változó értékét változtatjuk meg egy függvényen belül, akkor az eredeti változót változtattuk meg és nem egy másolatot.
Ezért a global kulcsszót lehetőleg minél kevesebbszer használjuk.
Függvényhez statikus változót a static kulcsszóval deklarálhatunk, ld. később. A nevek interpolálása a Perlhez hasonlóan működik.
A PHP támogatja a statikus változók alkalmazását függvényekben, annak érdekében, hogy a függvényekben a lokális változók ne veszítsék el értéküket a hívások között.
Az állandó a PHP-ben egy előre meghatározott érték azonosítója. A változókkal ellentétben értéke a definiálása után nem változtatható meg - kivéve két speciális esetet: a __FILE__ és a __LINE__ állandót.
Az állandók nevei is kis/nagybetű érzékenyek, bár nem előírás, de a programozói gyakorlat szerint csupa nagybetűvel írjuk őket.
Az állandók nevei az angol abc betűit, valamit az ASCII kódtábla 127-255 elemeit tartalmazhatják (pl. aláhúzás jelet igen, de kötőjelet nem), mindig betűvel, vagy aláhúzás jellel kell kezdődniük.
Fontosabb különbségek a változókhoz képest:
Állandót a PHP define() beépített függvényével lehet meghatározni. Mint már tudjuk, értéke ezután nem változik.
A defined() függvénnyel tudjuk lekérdezni, hogy egy karaktersor már definiált állandónak felel-e meg. A definiált állandók listáját a get_defined_constants() függvénnyel kapjuk meg.
A PHP-ben számos előre definiált állandó áll a programozó rendelkezésére. Néhány további fontosabb előre definiált állandó:
Különleges, úgynevezett MÁGIKUS állandók a __FILE__ és a __LINE__ állandók, melyek értéke - a főszabálytól eltérően futásidőben változik.
A __FILE__ az éppen feldolgozás alatt álló scriptfájl nevét tartalmazza, a __LINE__ pedig az aktuális sornak a számát.
Egyéb mágikus állandók:
Kétféle függvény létezik: a nyelvbe beépített függvény és az általunk létrehozott függvény. A PHP-ben rengeteg beépített függvény van:
A print abból a szempontból nem jellegzetes függvény, hogy paramétereit nem kell zárójelbe tenni.
A print("Hello Web!"); és print "Hello Web!"; egyaránt helyes megoldások. Ez egy különleges függvény.
Szinte az összes többi függvénynél kötelező a zárójel; akár kell paramétert átadnunk, akár nem.
Mivel a PHP-ben nincsenek típusok, logikusnak tűnik, hogy a függvények visszatérési típusát sem kell előre meghatározni.
A visszatérési értéket egyszerűen a return utasítással határozzuk meg.
A return befejezi a függvény futtatását és az utána írt kifejezést küldi vissza a hívónak.
Példa beépített abs függvényre:
Ebben a példában a $szam nevű változóhoz a -321-es értéket rendeltük, majd átadtuk az abs() függvénynek, amely elvégzi a szükséges számításokat és visszaadja az eredményt. Ezt az új értéket rendeljük az $ujszam nevű változóhoz és kiírjuk az eredményt. A feladatot megoldhattuk volna segédváltozók segítsége nélkül is, az abs() függvényt adva közvetlenül a print() paramétereként:
Példa a hibakezelő operátorra:
PHP-ben nincs:
Az összehasonlító műveletek az operandusokon vizsgálatokat végeznek. Logikai értékkel térnek vissza, vagyis értékük true lesz, ha a feltételezett viszony fennáll, és false, ha nem. Ez a típusú kifejezés az olyan vezérlési szerkezetekben hasznos, mint az if és while utasítások.
Műveleti jel | Név | Igaz, ha | Példa | Eredmény |
== | egyenlő | a két érték megegyezik | $x == 5 | false |
!= | nem egyenlő | a két érték különböző | $x != 5 | true |
=== | azonos | a két érték és típus megegyezik | $x === 5 | false |
!== | nem azonos | a két érték vagy típus különböző | $x !== 5 | true |
> | nagyobb, mint | a bal oldal nagyobb a jobb oldalnál | $x > 4 | false |
>= | nagyobb vagy egyenlő | a bal oldal nagyobb a jobb oldalnál vagy egyenlő vele | $x >= 4 | true |
< | kisebb, mint | a bal oldal kisebb a jobb oldalnál | $x < 4 | false |
<= | kisebb vagy egyenlő | a bal oldal kisebb a jobb oldalnál vagy egyenlő vele | $x <= 4 | true |
+ | összeadás |
- | kivonás |
* | szorzás |
/ | osztás |
% | maradékos osztás |
A fenti operátorok mindegyike lebegőpontos számot ad eredményül, ha az input lebegőpontos, valamint az egészeket is lebegőpontossá konvertálják, ha az eredmény nem egész. A műveleteket az operációs rendszer végzi (a szerver operációs rendszere), ezért azok pontossága a hardware-től és attól függ, hogy az operációs rendszer hogyan kezeli a hardware eredményeit.
A konkatenáció jele a pont '.' , mindkét operandust karakterláncnak tekintve, a jobb oldali elemet hozzáfűzi a bal oldalihoz. Vagyis a
"Para" . " Zita" kifejezés értéke: "Para Zita" lesz.
Az elemek típusuktól függetlenül karakterláncként értékelődnek ki és az eredmény is mindig karakterlánc lesz.
. | konkatenáció |
.= | végéhez csatolás |
Annak ellenére, hogy valójában csak egy hozzárendelő művelet van, a PHP számos további műveletjelet biztosít, amelyek a bal oldali operandust módosítják. A műveletek az operandusokat általában nem változtatják meg, ez alól azonban a hozzárendelés kivétel. Az összetett hozzárendelő műveletjelek egy hagyományos műveletjelből és az azt követő egyenlőségjelből állnak. Az összetett műveletjelek megkímélnek minket attól, hogy két operátort kelljen használnunk és az elgépelés esélyét is csökkentik.
Például egyenértékű a következővel:
Hozzárendelő műveletjelet minden aritmetikai és összefűző jelhez kapcsolhatunk.
Műveletjel | Példa | Egyenértékű kifejezés |
+= | $x += 5 | $x = $x + 5 |
-= | $x -= 5 | $x = $x - 5 |
*= | $x *= 5 | $x = $x * 5 |
/= | $x /= 5 | $x = $x / 5 |
%= | $x %= 5 | $x = $x % 5 |
.= | $x .= "próba" | $x = $x . "próba" |
A példákban a $x változó értéke változik meg, a jobb oldali operandusnak megfelelően.
Ha hosszú szöveget szeretnénk változóba írni, a dokumentumbejegyzés rá a legjobb megoldás. Operátor a <<< szimbólum. Használatakor meg kell adnunk a beolvasandó szöveg határait, ezt a példában a sokszo-val tesszük meg. A sokszo; -nak új sorban kell kezdődnie. A szövegben bármilyen karakter állhat, kivéve a '$'-t, amit természetesen a '\' jellel kiemelve szúrhatunk be. (\$ megengedett és $-t fog kiírni.)
Példa:
$hosszuszoveg = <<< sokszo
++ | növelő operátor |
-- | csökkentő operátor |
Természetesen nem mindegy, hogy a változó előtt vagy után használjuk az operátort:
Ez a kód 3-at ír ki a képernyőre, aztán a $a változó értéke nő 4-re.
Ez a kód már 4-et fog kiírni, mivel a növelést a kiíratás előtt végeztük el.
A '@' operátor használatával letilthatjuk a hibák kiírását. Főleg akkor használjuk, ha gyorsan kell kódot írnunk, amely nem mentes az olyan hibáktól, amelyek nem végzetesek, tehát maga a program "jól" működik, de nem volt időnk minden hibaüzenetet kivenni. Ha egy függvénynek, ami elé beírtuk a '@' operátort, nincsen egyedi hibajelentési mechanizmusa, a $php_errormsg -ben lehet megtalálni a hibát.
& | ÉS, azaz AND |
| | VAGY, azaz OR |
^ | kizáró vagy, azaz XOR |
~ | NO |
<< | balra tolás |
>> | jobbra tolás |
Műveleti jel | Név | Igaz, ha | Példa | Eredmény |
|| | vagy | a bal vagy a jobb operandus igaz | true || false | true |
or | vagy | a bal vagy a jobb operandus igaz | true or false | true |
xor | kizáró vagy | vagy a bal, vagy a jobb operandus igaz, de csak az egyikük | true xor true | false |
&& | és | a bal és a jobb operandus is igaz | true && false | false |
and | és | a bal és a jobb operandus is igaz | true and false | false |
! | tagadás | az egyetlen operandus hamis | !true | false |
Miért kell kétféle vagy és és műveletjel? A magyarázat a műveletek kiértékelési sorrendjében rejlik, amelyet a fejezet későbbi részében láthatunk.
A vissza-aposztróf ' ` ' operátor használatával ugyanazt érjük el,
mintha a system() függvényt használnánk: mindent, amit a két ' ` ' jel közé írunk, az operációs rendszernek küldi el a php végrehajtásra.
Amit az operációs rendszer válaszát stringként kapjuk vissza.
Példa:
Az operátorok precedenciája fentről lefelé csökkenő sorrendben (az egy sorban levőknek ugyanannyi):