6.3. fejezet¶
A fejezet anyaga¶
Ebben a fejezetben áttekintjük a PHP alapvető nyelvi elemeit.
A PHP nyelvi alapjai¶
Kommentek¶
PHP-ban is írhatunk a forráskódba kommenteket (megjegyzéseket):
- egysoros kommenteket
//
után vagy#
után adhatunk meg - többsoros kommenteket
/*
és*/
között írhatunk.
1 2 3 4 5 6 7 |
|
Kiíratás¶
A PHP többféle lehetőséget is biztosít adatok kiíratására.
A két legalapvetőbb utasítás, amellyel adatokat írhatunk ki az alapértelmezett kimenetre, az echo
és a print
. Mindkét utasítás esetén használhatunk a kiírandó kifejezésben HTML markup-ot is (pl. sortörést a <br/>
taggel tehetünk).
Az echo
és print
többnyire hasonlóan viselkednek, csupán néhány apróbb működésbeli különbség van köztük:
- az
echo
-nak nincs visszatérési értéke, míg aprint
-nek van (konstans 1), így aprint
használható kifejezésekben - az
echo
-nak több paraméter is átadható, míg aprint
-nek csak egy - működését tekintve az
echo
valamelyest gyorsabb aprint
-nél.
Megjegyzés
Az echo
és print
utasításokat zárójelekkel is használhatjuk (echo()
, print()
).
Tömbök és objektumok részletes kiíratására a print_r()
függvényt használjuk. Ez rekurzívan kiírja a paraméterül kapott kifejezés értékét.
A die()
és exit()
függvényekkel kiléphetünk a programból. Ezeknek opcionálisan átadható paraméterben egy szöveg (hibaüzenet) vagy egy egész szám (kilépési kód). Ha szöveges paramétert adunk át, akkor azt ki is írják a képernyőre.
1 2 3 4 5 6 7 8 9 |
|
A kód kimenete
Hello echo! Hello print! Az élet értelme 42. Array ( [0] => alma [1] => banán [2] => citrom ) Valamit elszúrtunk...
Változók¶
PHP-ban a változók neve előtt minden esetben dollárjel ($
) szerepel. A változónév csak betűket, számokat és alulvonás karaktert tartalmazhat, valamint betűvel vagy alulvonással kell kezdődnie (tehát a változónév nem kezdődhet számmal). A változónév érzékeny a kis- és nagybetűkre (tehát például $nev
és $NEV
két külön változónak számít).
Egy változónak az =
(egyenlőségjel) operátorral adhatunk értéket. A változók értékét legegyszerűbben az echo
vagy print
utasítások valamelyikével írathatjuk ki.
1 2 3 4 |
|
A kód kimenete
Szia! A nevem Gipsz Jakab.
Érték és referencia szerinti értékadás¶
Amikor PHP-ban egy változónak egy másik változót adunk értékül, akkor alapértelmezett módon érték szerinti értékadás történik (kivéve objektumok esetén, lásd: később). Ekkor az eredeti változó értéke lemásolódik, így az értékadás után a két változó egymástól teljesen függetlenül módosítható.
Az &
(és-jel) operátorral lehetőségünk van referencia szerinti értékadásra is. Ekkor nem történik másolás, így mindkét változó ugyanarra az adatra mutat. Ekkor, ha az értékadás után az egyik változó értéke megváltozik, akkor ugyanúgy módosul a másik változó értéke is.
Nézzünk egy példát! Az alábbi kódban érték szerinti értékadás történik ($b = $a
). Ekkor az $a
és $b
változók értéke egymástól teljesen függetlenül módosítható.
1 2 3 4 5 6 |
|
Nézzük meg, mi történik referencia szerinti értékadás esetén! Az alábbi kódban a $b
egy referencia az $a
változóra. Ekkor, ha valamelyik (akár az $a
, akár a $b
) változó értéke megváltozik, akkor a másik értéke is ugyanúgy módosul.
1 2 3 4 5 6 |
|
Gyengén típusosság¶
A fenti kódokban észrevehettük, hogy a változók létrehozásakor nem írjuk ki expliciten a változótípust. Ennek az az oka, hogy a PHP egy gyengén típusos nyelv, ami azt jelenti, hogy a PHP értelmező automatikusan "ki tudja találni" a változók típusát a bennük tárolt érték alapján.
A gyengén típusosság egyik érdekes következménye, hogy ugyanabban a változóban akár eltérő típusú adatokat is tárolhatunk. Erre láthatunk példát az alábbi kódban.
1 2 3 4 5 |
|
Konstansok¶
PHP-ban létrehozhatunk konstansokat (állandókat) is. Ezeknek a kezdőértéke nem változtatható meg a program futása során, különben szintaktikai hibát kapunk.
A változókkal ellentétben a konstansok neve előtt nem szerepel dollárjel. Konvenció alapján a konstansok nevét csupa nagybetűvel szoktuk írni, és ha a konstansnév több szóból áll, akkor a szavakat alulvonással választjuk el (pl. EZ_EGY_JO_KONSTANSNEV
). A konstansok neve érzékeny a kis- és nagybetűkre!
PHP-ban konstansokat a define()
függvénnyel definiálhatunk. Ennek első paramétereként megadjuk a konstans nevét (string), második paraméterként pedig a konstans értékét.
1 2 3 4 5 6 |
|
A kód kimenete
Az élet értelme: 42
A PHP biztosít számunkra úgynevezett mágikus konstansokat is. Ezek előre definiált, beépített konstansok, amelyek neve dupla alulvonással kezdődik és végződik. Néhány fontosabb mágikus konstans:
__LINE__
: a fájl aktuális sorának száma__FILE__
: a fájl teljes elérési útvonala és neve__FUNCTION__
: a függvény neve__CLASS__
: az osztály neve__METHOD__
: az osztály metódusának neve__NAMESPACE__
: a névtér neve.
Adattípusok¶
Ebben a részben áttekintjük a PHP nyelv adattípusait és azok fontosabb jellemzőit.
A bool
típus¶
Logikai adattípus. A TRUE
(igaz) és FALSE
(hamis) logikai értékek valamelyikét veheti fel. PHP-ban ez a két kulcsszó nem érzékeny a kis- és nagybetűkre.
1 2 3 4 |
|
Az int
típus¶
Az egész számok típusa. PHP-ban az egész számok mindig előjelesek, tehát C-vel ellentétben itt nincs előjeltelen egész típus.
A PHP_INT_MIN
és PHP_INT_MAX
konstansokkal lekérdezhető az int típussal ábrázolható legkisebb és legnagyobb érték. Ezek a határok architektúrafüggők. Ha egy szám az int típus értelmezési tartományán kívül esik, akkor automatikusan lebegőpontosra lesz konvertálva.
1 2 3 4 5 |
|
A float
típus¶
A lebegőpontos ("valós") számok típusa. PHP-ban nincs külön egyszeres és dupla pontosságú lebegőpontos típus. A float típussal ábrázolható maximális érték architektúrafüggő.
A lebegőpontos számok megadásakor tizedespontot használunk tizedesvessző helyett.
1 2 3 4 5 |
|
A string
típus¶
Szöveges adattípus. Tetszőleges hosszúságú karaktersorozat megadására használhatjuk.
A stringeket leggyakrabban aposztrófok ('...'
) vagy idézőjelek ("..."
) között adjuk meg. A lényegi különbség a két megadási mód között, hogy idézőjeles megadás esetén a változók értékei és az escape-szekvenciák behelyettesítődnek, míg aposztrófos megadás esetén nem.
1 2 3 4 5 |
|
A kód kimenete
$szoveg értéke: Szeretem a Webtervezést!
PHP-ban a stringek összefűzésére a .
(pont) operátort használjuk.
1 2 3 |
|
Természetesen PHP-ban is van lehetőségünk a stringek karaktereinek indexelésére. Erre a más nyelvekből ismerős szögletes zárójel operátort használhatjuk: $szoveg[index]
. Hasonlóképpen, mint C-ben, PHP-ban is 0-tól kezdődően indexeljük a stringek karaktereit.
Egy kis érdekesség, hogy PHP-ban negatív indexeket is megadhatunk. Ekkor a string végétől kezdünk el számolni (tehát az utolsó karakter indexe -1, az utolsó előtti karakteré -2 stb.).
1 2 3 4 5 |
|
A kód kimenete
A legelső karakter: H Az utolsó karakter: d
A PHP rengeteg beépített stringkezelő függvényt biztosít számunkra. Ezek közül áttekintünk néhány fontosabbat (a stringkezelő függvények teljes listája elérhető itt).
strlen($s)
: visszaadja az$s
string hosszátstrtolower($s)
: csupa kisbetűssé alakítja az$s
stringetstrtoupper($s)
: csupa nagybetűssé alakítja az$s
stringetsubstr($s, $start, $length)
: visszaadja az$s
string egy részstringjét, annak$start
indexétől kezdődően,$length
darab karakteren keresztülstrpos($s, $text)
: visszaadja a$text
részstring első előfordulásának kezdőindexét az$s
stringben (FALSE
-ot ad vissza, ha nem találja)str_replace($old, $new, $s)
: lecseréli az$s
stringben az$old
részstring összes előfordulását a$new
szövegreexplode($delim, $s)
: feldarabolja az$s
stringet$delim
karakterek mentén (egy tömbbel tér vissza)
1 2 3 4 5 6 7 8 9 10 11 |
|
A kód kimenete
32 a citromos fagyi a legjobb fagyi A CITROMOS FAGYI A LEGJOBB FAGYI A Citrom 2 A Citromos Süti A Legjobb Süti
Az array
típus¶
Tömb adattípus. Több elem tárolására alkalmas adatszerkezet. C-vel ellentétben a PHP-beli tömbök dinamikus méretűek, és nem feltétlenül csak azonos típusú elemek tárolhatók bennük.
PHP-ban kétféle szintaxissal hozhatunk létre tömböket:
- az
array()
konstrukció segítségével - a tömbelemek szögletes zárójelek közötti felsorolásával.
Ebben a jegyzetben szinte mindig a szögletes zárójeles megadási módot fogjuk használni tömbök létrehozására.
1 2 3 4 5 6 |
|
PHP-ban a tömb adattípus valójában egy rendezett leképezést valósít meg, ugyanis kulcs-érték párokat tartalmaz. Az ilyen tömböket asszociatív tömböknek is nevezzük.
A fenti kódpéldában a tömbök létrehozásakor csak értékeket soroltunk fel, ekkor a kulcsok alapértemezés szerint a tömbindexek lesznek (0-tól kezdődően). A tömbök létrehozásakor a kulcs-érték párokat expliciten is megadhatjuk a kulcs => érték
szintaxissal.
- A kulcsok csak stringek vagy egész számok lehetnek, az értékek típusára nincs megkötés.
- Egy asszociatív tömbben minden kulcs pontosan 1-szer fordulhat elő. Ha a kulcsok között ismétlődés van, akkor csak a tömbben legkésőbb szereplő kulcs és az ahhoz tartozó érték lesz jelen a tömbön belül.
A tömbök indexelése a kulcs alapján történik: $tomb[kulcs]
.
1 2 3 4 5 6 7 |
|
A $tomb[kulcs] = ertek
szintaxissal beszúrhatunk egy új kulcs-érték párt a tömb végére.
1 2 3 4 5 6 7 8 9 10 |
|
A tömbök kezelérése számos beépített függvény létezik PHP-ban. Néhány fontosabb ezek közül (teljes lista itt):
count($t)
: visszaadja a$t
tömb hosszátsort($t)
: rendezi a$t
tömb értékeitin_array($e, $t)
: visszaadja, hogy$e
szepel-e a$t
tömb értékei közöttarray_key_exists($k, $t)
: visszaadja, hogy$k
szerepel-e a$t
tömb kulcsai közöttarray_pop($t)
: törli a$t
tömb utolsó elemétarray_push($t, $a, $b, ...)
: beszúrja az$a
,$b
, ... elemeket a$t
tömb végérearray_shift($t)
: törli a$t
tömb első elemétarray_unshift($t, $a, $b, ...)
: beszúrja az$a
,$b
, ... elemekt a$t
tömb elejéreimplode($delim, $t)
: egy stringgé egyesíti a$t
tömb elemeit,$delim
karakterek mentén.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
A kód kimenete
4 Hurrá, van málna fagyi! A kedvenc fagyi ízeink: csokoládé, málna, szamóca, sztracsatella.
PHP-ban létrehozhatunk többdimenziós tömböket is. Ezek tulajdonképpen olyan tömbök lesznek, amelyek elemei szintén tömbök. Az alábbi példában egy kétdimenziós tömb látható.
1 2 3 4 5 6 7 8 |
|
Az object
típus¶
Osztályból példányosított objektumok adattípusa. Az objektumokkal részletesebben a 10. fejezetben fogunk foglalkozni.
1 2 3 4 |
|
A resource
típus¶
Erőforrás típus. Jellemzően egy fájlra vagy egy adatbázis-kapcsolatra mutató referenciát jelöl.
1 2 3 4 |
|
A null
típus¶
Olyan adattípus, amelynek egyetlen lehetésges értéke a NULL
speciális érték. A NULL
kulcsszó nem érzékeny a kis- és nagybetűkre.
A NULL egy olyan változót jelöl, ami nem tárol (értelmes) értéket. Például az inicializálás nélkül létrehozott változók típusa automatikusan NULL
lesz. Ezen kívül a NULL
értéket expliciten is értékül adhatjuk egy változónak.
1 2 3 4 |
|
Típusinformációk¶
Mivel a PHP egy gyengén típusos nyelv, ezért előfordulhat, hogy egy változó nem olyan típusú értéket tárol, mint amire számítunk. Emiatt felmerülhet az igény arra, hogy lekérdezhessük a változókhoz tartozó típusinformációkat.
A var_dump()
függvény segítségével rekurzívan kiírathatjuk a paraméterül kapott kifejezés típusát és értékét.
Az is_
kezdetű beépített függvényekkel típusellenőrzést végezhetünk: lekérdezhetjük, hogy a függvény paramétere adott típusú-e. A fontosabb függvények típusellenőrzésre: is_bool()
, is_int()
, is_float()
, is_string()
, is_array()
, is_object()
, is_resource()
, is_null()
.
1 2 3 4 5 6 7 8 9 |
|
A kód kimenete
string(4) "sajt" array(3) { [0]=> int(10) [1]=> int(20) [2]=> int(30) } bool(true) bool(false)
Típuskonverzió¶
PHP-ban az adattípusok közötti konverzió automatikusan történik. Két egyszerű példa automatikus típuskonverzióra:
- Ha a string összefűzésre használatos
.
(pont) operátor valamely operandusa nem szöveges típusú, akkor automatikusan stringre lesz konvertálva. - Ha egy matematikai művelet valamely operandusa nem egy szám, akkor automatikusan valamely numerikus típusra próbálja konvertálni (ha a másik operandus lebegőpontos, akkor lebegőpontosra, egyébként pedig egészre).
1 2 3 4 5 6 |
|
Az automatikus típuskonverzió mellett természetesen lehetőségünk van arra is, hogy egy kifejezést manuálisan egy másik típusra konvertáljunk. Ezt nevezzük típuskényszerítésnek, avagy typecasting-nak. A typecasting szintaxisa ugyanúgy néz ki, mint C-ben: (céltípus)érték
.
1 2 3 4 5 |
|
Fontosabb operátorok¶
A PHP fontosabb operátorai:
Kategória | Operátorok |
---|---|
Aritmetikai operátorok | + , - , * , / , % , ** |
Hozzárendelő operátorok | = , += , -= , *= , /= |
Inkrementáló, dekrementáló operátorok | ++ , -- |
Összehasonlító operátorok | == , === , != , !== , < , <= , > , >= |
Logikai operátorok | && , || , ! |
A legtöbb operátor a C-ben tanultakkal megegyező módon viselkedik, viszont van néhány különbség is, amit érdemes kiemelni.
Az egyik ilyen különbség az osztás operátor működése. PHP-ban ugyanis a /
operátor minden esetben lebegőpontos osztást végez, még akkor is, ha az operandusai egész számok. Ha egészosztást szeretnénk végezni, akkor ezt PHP-ban az intdiv()
függvénnyel tehetjük meg.
A **
(dupla csillag) operátor újdonság lehet számunkra. Ez a hatványozást jelenti.
1 2 3 4 5 |
|
Külön érdemes beszélni még a ==
(dupla egyenlő) és ===
(tripla egyenlő) operátorokról. Mindkettőt kifejezések összehasonlítására használjuk, viszont van egy lényegi különbség a két operátor működésében:
- A
==
operátor pontosan akkor ad vissza igazat, ha a két operandusának értéke megegyezik - A
===
operátor pontosan akkor ad vissza igazat, ha a két operandusának értéke és típusa egyaránt megegyezik.
Nézzünk egy példát arra, amikor a két operátor eltérően működik!
1 2 3 4 |
|
A kód kimenete
bool(true) bool(false)
Mi is történik itt? Mivel egy egész számot akarunk egy bool értékkel összehasonlítani, ezért a PHP automatikus típuskonverziót végez. A konverzió után a két változó értéke megegyezik (hiszen a FALSE
logikai érték pont a 0
int értéknek felel meg), ezért a ==
operátor igazat ad vissza. Viszont mivel a 0
egy int, a FALSE
pedig egy bool típusú adat, ezért a ===
operátor visszatérési értéke hamis lesz.
A ==
operátor tagadása a szokásos módon a !=
(ez pontosan akkor ad vissza igazat, ha a két operandus eltérő értékű), míg a ===
operátort a !==
segítségével tagadhatjuk (ez pontosan akkor ad vissza igazat, ha a két operandus eltérő értékű vagy típusú).
Tipp
Az összehasonlításoknál célszerű mindig a ===
(tripla egyenlő) operátort használni.
Vezérlési szerkezetek¶
Szelekciós vezérlés¶
A szelekciós vezérlés megvalósítására az if
, else
, else if
és switch
utasításokat használjuk. Ezek szintaxisa és működése megegyezik a C-ben tanultakkal. PHP-ban az else if
utasítás egybe is írható: elseif
.
A feltételek megadására a korábban tanult feltételes és logikai operátorokat használjuk.
Példa: Egy program, amely az $eletkor
változó értékének függvényében ír ki adatot a képernyőre
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Példa: Egy program, amely kiírja az érdemjegynek megfelelő szöveges értékelést
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Azokat a feltételeket, amelyek csupán egy if
-ágból és egy else
-ágból állnak, le is rövidíthetjük a C-ből ismerős ternary operátor segítségével. Ennek a szintaxisa a szokásos: feltétel ? művelet ha igaz : művelet ha hamis
.
Példa: Egy szám paritásának vizsgálata
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Ismétléses vezérlés (Ciklusok)¶
PHP-ban a while
, do... while
, for
és foreach
utasításokat használjuk ismétléses vezérlés megvalósítására. Ezek közül az első három ugyanúgy működik, mint C-ben.
Példa: Írassuk ki az egész számokat 1-től 10-ig a while
, do... while
és for
ciklusokkal!
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 |
|
1 2 3 4 5 |
|
A foreach
utasításról külön érdemes beszélni. Ezt jellemzően tömbök listaszerű bejárására használjuk. Ekkor a ciklusváltozó magukon a tömbelemeken iterál végig (tehát itt nem indexváltozónk van, mint a for
esetén).
Példa: A foreach
szerkezet használata
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
A kód kimenete
220 70 150 szendvics ára: 220 forint tea ára: 70 forint csoki ára: 150 forint
Érdemes megjegyezni, hogy a foreach
alapértelmezett módon a tömb egy másolatával dolgozik. Ha az eredeti tömbbel szeretnénk dolgozni, akkor referenciát kell átadnunk.
Példa: Csökkentsük az $arak
tömbben minden étel és ital árát 10%-kal!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
A kód kimenete
Array ( [szendvics] => 220 [tea] => 70 [csoki] => 150 ) Array ( [szendvics] => 198 [tea] => 63 [csoki] => 135 )