Még októberben egy másik blogba volt szerencsém egy hosszabb bejegyzést írni az akkor még elég brékingnek számító PHP 5.4 újdonságairól. Az a blog zártkörű, de a bejegyzést most itt is közölhetem, illetve, azóta foglalkoztam is jó pár órát az 5.4-gyel, és gondoltam összeírom a tapasztalatokat.
Március elsején jelent meg a PHP 5.4.0, amely a PHP hivatalos oldalán letölthető és kipróbálható, Windowsra van kész változat, illetve például OS X-re is lehet ilyesmit találni, ha az ember nem akar maga fordítani (én nem szeretek). Az új verzió főként nyelvi változtatásokat, hibajavításokat és tucatnyi elavult, deprecated funkció takarítását hozta. Lássuk, mik ezek az újdonságok.
Traitek
A trait voltaképpen egy viselkedésminta, amely a horizontális újrahasznosítást segíti elő. Ez így egy nagyon tudományosan megfogalmazott mondat, de mit is jelent vaójában? A trait
voltaképpen egy osztály és egy interfész keveréke. Viselkedésmintát (akár komplett metódusokat és osztályváltozókat) írhatunk le benne, majd egy osztály vagy akár maga egy trait felhasználhat több ilyet. Fontos megjegyezni, hogy az instanceof
segítségével nem tudjuk ellenőrizni, hogy egy osztály rendelkezik-e valamelyik viselkedésmintával, azonban a ReflectionClass::getTraitNames();
metódusa egy tömbbel tér vissza, amely a megvalósított viselkedésminták megnevezéseit tartalmazza. Itt jegyezném meg, hogy nem árt kerülni, mivel – mint ahogyan azt láthattuk korábban – a ReflectionClass elég költséges mutatvány.
A viselkedésmintákról további információk itt olvashatók.
Tömbök
Persze, nem a tömbök megjelenése jelenti az újdonságot, hanem néhány hasznos változtatás ezen a területen. Talán a legfontosabb, hogy mostmár a metódushívásból érkező tömbök elemeire közvetlenül is hivatkozhatunk. A deklarálás és feltöltés is sokkal egyszerűbb lett; az array();
meghívása nélkül, szögletes zárójelben felsorolva is inicializálhatjuk a tömböt.
Callback metódusok kényelmesebben hívhatók
Nem kell a call_user_func();
metódushoz nyúlnunk, ha valami hasonlót szeretnénk:
Feltöltés adatai, megszakítása
Könnyedén kinyerhetünk egy feltöltéssel kapcsolatos minden információt, így sokkal egyszerűbb például a feltöltést állapotát százalékban, vagy mondjuk a hátralévő időt egy AJAX-szkript segítségével jelezni.
Beépített webszerver
Tesztelésre kiváló lehet, illetve ha csak gyorsan szeretnénk megnézni valamit, Apache vagy bármely más webszerver telepítése nélkül:
php -S localhost:8080 -t /var/www
A -S
(ne keverjük a kisbetűs változatával) kapcsolóval kérhetjük, hogy szerverként fusson a PHP, majd a hosztot és portot megadva a -t
kapcsolóval még a home könyvtárat is beállíthatjuk.
A webszerverrel játszottam a legtöbbet, az a személyes tapasztalatom, hogy nagyon jó ötlet, hosszú távon, ha nem hanyagolják el a fejlesztést, praktikus lehet, és amennyire meg tudom ítélni, terheléselosztás tekintetében nagyon praktikus ez a felállás, lásd a »Play! Framewor« példáját.
Mire jó? Tesztelni. Kipróbálni gyorsan valamit, lefuttatni gyorsan valamit, belőni egy gyorsan elérhető PHP-t, ami fut. Konkrét webes projektjeimet nagyon nehézkesen bírtam működésre, látszik, hogy sokkal inkább az Apache-hoz szocializálódtunk.
Mire lehet jó még? Személy szerint egy fájlfeltöltő rendszert terveznék alá, egészen konkrétan egy képkezelőt. Akármilyen img.valami.tld
, szépen beállítva, hogy az oda érkező kéréseket egy PHP 5.4-es szerver szolgálja ki, és könnyedén megtudhatunk a feltöltésről minden információt (hol tart, mi a státusza, akármi), a PHP 5.4-re frissítése nélkül. (Ami persze jó lenne, ha kötelező lenne, de a gyakorlatban tudjuk és látjuk, hogy sokszor még az 5.2-t sem lehet eldobni.)
Egyéb, nem elhanyagolható apróságok
Bináris számformátum
A 0b
prefixszel már közvetlenül dolgozhatunk bináris számokkal.
Jobban támogatott multibájt
A multibájt funkciók engedélyezéséhez már elegendő a php.ini
fájlban módosítani a zend.multibyte
opciót.
Hibajavítások, optimalizálások
Gyorsabb, szebb és okosabb a PHP 5.4, rengeteg hibajavítást és optimalizálást hajtottak végre. Nem mértem, de tervezem.
Csendesebb @csendes operátor
Valószínűleg ennek is rengetegen örülnek: a @
operátor működése sokkal gyorsabb lett. Ennek oka egyszerű: nem két ini_set()
fut le a háttérben, illetve a generált opkód mérete is sokkal kisebb.
JIT-alapú lett a $GLOBALS
A változó már csak akkor kerül inicializálásra, ha hivatkozunk arra. Teljesítményjavításnak kiváló, azonban érdemes odafigyelni a különböző PHP accelerator megoldásokra, ezeknek lehet vele problémájuk.
Viszlát, register_globals
!
A vonatkozó ini-beállítások megszűntek, hasonlóképpen a register_long_arrays
, a “csökkentett mód” és a magic quotes is erre a sorsra jutott. Érdekesség továbbá, hogy az E_STRICT
is megszűnik, beolvasztották az E_ALL
-ba.
Végezetül
Rengeteg hasznos újdonságot, kényelmes módosítást és a még tökéletesebb működést elősegítő fejlesztést tartalmaz a PHP 5.4. Mostantól kezdjünk el csúnyán nézni azokra, akik megkérdezik tőlünk, hogy PHP 5.2 elegendő-e egy szerveren. Nem, nem elegendő, hajtani és küzdeni kell, hogy a régi PHP 5.2-es kódok legalább az 5.3-as szintet elérjék (onnan egyébként kis lépcső az 5.4). A migrálás nem nehéz, egy általános symfony 1.4-ben készült kód például zökkenőmentesen megy tovább 5.4 alatt, érzésre gyorsabban is (de erre mérget nem veszek, mert minimálisan sem jártam utána, hogy tényleg így van-e).
Szóval ezek vannak, érdemes kísérletezgetni. A traitekre sokan csúnyán néznek, mondván az OOP elmélet kiherélése, de rengeteg példát tudok, amikor hasznos lehet.
Töltsétek, nézzétek, írjátok, használjátok, szeressétek. Megéri, jó móka.
Andrei
2012. március 31. — 11:30:09
Köszi Mefi. Talán a jövő héten rávetem magam. Királyság. Elsőre sokkal kényelmesebbnek tűnik.
saxus
2012. április 01. — 01:41:03
Engem igazából egyvalami érdekelne: és mit törtek el a PHP 5.2/3-hoz képest? :))))
Andrei
2012. április 01. — 10:46:03
[re=6066249]saxus[/re]: :))) gonosssz
saxus
2012. április 03. — 22:18:37
[re=6066254]Andrei[/re]: …realista? 🙂
Mefi
2012. április 04. — 01:56:01
[re=6066249]saxus[/re]: 5.2 a legnagyobb ellenség, akkor lenne jó világ, ha már nem lenne éles webszerver, amin az létezne. Amúgy nézd végig a changelogot, de pl. a register_globals teljesen megszűnt, ez egy elég nagy előrelépés.
galamb
2012. április 04. — 16:33:22
[re=6066271]Mefi[/re]: Merjek olyat mondani, hogy ismerek olyan oldalakat, ami alatt még mindig négyes PHP van? 😉
Mefi
2012. április 06. — 00:13:03
[re=6066274]galamb[/re]: sajnos tudok én is ilyet 🙁
saxus
2012. április 10. — 20:19:59
[re=6066271]Mefi[/re]: 5.2-vel teljesen jól elvoltam, 5.3-nak is örültem, hogy végre javítottak néhány bugot, na meg a late static binding is jócucc, csak épp azt nem díjaztam, hogy volt, amit elcsesztek. Pl. call_user_func() -os mókák.