3. 27/3
Roadmap
● https://wiki.php.net/rfc/releaseprocess
– Évenkénti kiadások (minor vagy major verzió)
– 3 év támogatás a megjelenéstől számítva
● 2 évig hiba és biztonsági javítások
● +1 évig biztonsági javítások
● https://wiki.php.net/rfc/php53eol
– Az 5.5 megjelenését követően az 5.3-höz már csak a
biztonsági javítások jönnek 1 évig.
4. 27/4
Roadmap
● Az eredeti roadmap: https://wiki.php.net/todo/php55
● Elméletileg január 31 lett volna a beta1 (Feature Freeze).
● Gyakorlatilag március 31 lett belőle.
● A csúszás egyik legnagyobb oka a Zend Opcache feltűnése.
● Q1 helyett Q2 lesz a végleges kiadás időpontja a szükséges
beta/RC-k számától függően.
● Tehát az 5.3 EOLed lesz ~2014 Q2-től.
6. 27/6
Finally
● A finally minden esetben(siker, el nem kapott
kivétel,return) meghívódik, kivéve a fatális hibákat.
● Így a legegyszerűbb megoldani, hogy minden
esetben feltakarítson maga után a kódunk (temp
fájlok törlése, lock elengedése, etc.).
● Egymásba ágyazott try blokkok esetén belülről
kifelé(fentről lefelé) haladó sorrendben hívódnak
meg a finally-k.
8. 27/8
Generátorok
● 1-1 sor lekérdezése belekerülhetne a ciklusba, de az csúnya, nem érdekel
minket honnan, vagy hogyan jön az adat, mi fel akarjuk dolgozni.
● getFilesFromFile() visszatérhetne egyben az egész tömbbel, de az
feleslegesen emelné a peak memória használatot, plusz nem biztos, hogy
mindig csak véges elemszámot tudnánk generálni.
● getFilesFromFile() visszatérhetne egy iterátorral ami már jó, nem kell
egyszerre sok memóriát allokálni, és megvalósítható a végtelen elemszám
generálása is de elég sok boilerplate kell hozzá, plusz szembemegy a PHP
multiparadigmás elveivel, ha csak így lehet megoldani.
9. 27/9
Generátorok
●
A yield-et tartalmazó függvény első hívásakor egy Generator példánnyal tér vissza, amely egy
Iterator-t valósít meg.
●
A Generator osztály nem példányosítható manuálisan.
●
A visszakapott Generator bejárása meghívja(folytatja) a függvény futását a következő yield-ig,
amelynek az értékével visszatér.
●
Ez a pingpong megy amíg nem jön egy return; a Generatorból, vagy el nem fogynak a yieldek,
vagy abba nem hagyja a hívó az iterálást, vagy nem jön egy a generátorban el nem kapott
Exception.
● Yield dobhat kulcs => érték párt, illetve mind érték mind referencia szerint.
● A Generator példány send metódusának hívásával lehet adatot is küldeni a generátor
függvénynek, ez ugyanúgy lépteti az iterációt és a függvénytörzsben a yield visszatérési
értékeként érkezik meg a küldött adat.
●
A Generator példány throw metódusával lehet kivételt is dobni kívülről, amit ugyanúgy lépteti az
iterációt, ha a függvénytörzsben elkapódik a kivétel, akkor a következő elem jön vissza, ha nem,
akkor a kivétel.
10. 27/10
Opcache
●
A Zend az Optimizer+ nevű fizetős opcode cache-ét tette nyílt forrásúvá, és (alapból
kikapcsoltan) be fog kerülni az 5.5-be core ext-ként.
● A core fejlesztők között van több jelenlegi/ex Zend alkalmazott, aki ismeri a
kódbázist, a kódnyitás után elég sokan kezdék el nézegetni, talán több aktív
fejlesztője lesz, mint az APCnek.
●
Sajnos a Zend stackben nem használnak Thread Safe SAPI-t, szóval TS
környezetben akad még vele munka, de elméletileg dolgoznak az ügyön.
●
Mivel a core része, ezért jó esetben nem jöhet ki úgy új kiadás, hogy nincs hozzá
vagy törött az opcode cache támogatás (PHP 5.4 /o).
●
Data Cache funkciót nem tartalmaz, az APC ezen részét nem váltja ki,de
folyamatban van egy kicsontozott APC fejlesztése, ami csak változók tárolására
használható az APC-vel azonos API-n keresztül: https://github.com/krakjoe/apcu
●
Az APC fejlesztése valószínűleg le fog lassulni, meg fog állni.
13. 27/13
Egyszerűsített jelszó hash API
● array password_get_info ( string $hash )
– Visszaad egy tömböt: algo, algoName és options elemekkel.
● string password_hash ( string $password , integer $algo [, array $options ] )
● boolean password_needs_rehash ( string $hash , string $algo [, string $options
] )
● boolean password_verify ( string $password , string $hash )
● $options a salt-ot és a cost-ot tartalmazhatja jelenleg.
● algo PASSWORD_BCRYPT illetve PASSWORD_DEFAULT értékeket fogadja,
ahol a bcrypt az alapértelmezett. A későbbi verziókban ez a lista bővülhet (pl.
scrypt) illetve a default is változhat.
14. 27/14
Tömbök
● array_column()
– többdimenziós tömbből lehet vele visszakérni minden
sorból egy megadott oszlophoz tartozó értékek listáját.
● Egy Iterator key() függvényéből visszaadott tömb/object már
használható a foreach fejlécben közvetlenül.
● Foreach fejlécben a list() mostantól szabadon használható az
aktuális iterációhoz tartozó elem kibontására.
15. 27/15
Config
● sys_temp_dir
– Alapértelmezett temp dir adható meg.
– Ha ki van töltve, akkor ezt használja a php az OS specifikus
találgatás helyett.
● intl.use_exceptions
– Szabvány php hibák helyett kivételt dobjanak-e az intl funkciók
hiba esetén.
● mysqlnd.sha256_server_public_key
– Mysql SHA256 auth támogatáshoz a szerver nyilvános
kulcsának helye.
16. 27/16
Biztonság
● FILTER_VALIDATE_MAC, FILTER_SANITIZE_MAC
● hash_pbkdf2()
– hash függvény pbkdf2 alapokon, kötelezően meg kell adni a
használni kívánt hash algot, egy salt-ot és egy iterációszámot.
● openssl_pbkdf2()
– ugyanezt tudja, van rá némi esély, hogy ez nem éri meg a
release-t.
● A /e kapcsoló a preg_replace() hívásban (preg_replace_callback
javasolt helyette).
18. 27/18
gd
● Összefésülésre került a GD bitbucket tárolós és a php repóban lévő
verzió kódja.
● Új függvények(illetve tartozik hozzájuk egy kupac konstans is):
– imageflip()
– imagecrop()
– imagecropauto()
– imagesetinterpolation()
– imageaffine()
– imageaffinematrixget()
– imageaffinematrixconcat()
– imagescale()
19. 27/19
curl
● Új függvény: curl_file_create
● Új osztály: CURLFile
● Új konstans: CURLOPT_SAFE_UPLOAD
● Fájlfeltöltés 5.5 előtt:
curl_setopt($curl_handle, CURLOPT_POST, 1);
$args['file'] = '@/path/to/file';
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);
● Fájlfeltöltés 5.5ben:
curl_setopt($curl_handle, CURLOPT_POST, 1);
$args['file'] = new CurlFile('filename.png', 'image/png');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);
● A régi működés kikapcsolható a CURLOPT_SAFE_UPLOAD
20. 27/20
intl
● Uconverter osztály:
– Karakterkódolások között lehet oda-vissza
konvertálgatni szöveget.
– mb_convert_encoding()-hez képest extraként
megadható, hogy megadható, hogy mi történjen
az alapból nem leképezhető karakterekkel.
● rengeteg további intl/ICU okosítás(75 új függvény),
cserébe ICU követelmény felkúszott >= 4.0-ra.
21. 27/21
date
● Új DateTimeInterface interface.
● Új DateTimeImmutable osztály
– DateTime-mal szemben nem módosítja saját
magát, csak visszatér a módosult példánnyal,
● Mind a DateTime, mind a DateTimeImmutable a
DateTimeInterface megvalósítása.
23. 27/23
42
● 'The answer to life, the universe and everything'[0]
● array(42 =>'The answer to life, the universe and everything')[42]
● Abszolút osztálynév feloldás a class konstans használatával:
echo ClassName::class; // 'ANamespacedClassName'
● cli_get_process_title/cli_set_process_title: cli processzhez tartozó cím (ami ps kimenetben,
ablakfejlécben, etc. látszik) lekérdezhető és beállítható lesz minden nagyobb platformon.
● set_error_handler/set_exception_handler NULL callbackkel hívva visszaállítja a gyári handlert és
visszatér az utoljára beállítottal.
● boolval()
● Az empty() mostantól kifejezések vizsgálatára is használható.
● Systemtap támogatás, az 5.3-ban hozzáadott dtrace probe-ok mostantól systemtap-en keresztül is
elérhetőek.
● Az új Apache 2.4 handler támogatott lett windowson.
● Max-Age attribútum minden php-ből kreált sütire.
24. 27/24
Ami felmerült, de végül kimaradt
●
Accessors
– https://wiki.php.net/rfc/propertygetsetsyntax-v1.2
●
DateTime::__toString()
– https://wiki.php.net/rfc/datetime_tostring
●
Escaper
– https://wiki.php.net/rfc/escaper
●
Annotációk DocBlock alapokon
– https://wiki.php.net/rfc/reflection_doccomment_annotations
– https://wiki.php.net/rfc/annotations-in-docblock
●
Opcionális paraméterek default értékének használata a hívásnál
– https://wiki.php.net/rfc/skipparams
●
Függvényhívás paraméterlista végén vessző elfogadása
– https://wiki.php.net/rfc/trailing-comma-function-args
● „assuming $this from incompatible context” ellenjavalttá tétele
– https://wiki.php.net/rfc/incompat_ctx
●
(new Foo)->bar = 'baz'
– http://www.mail-archive.com/internals@lists.php.net/msg64194.html
●
„Pure-code” php fájlok
– https://wiki.php.net/rfc/phpp
● array_part()
– https://wiki.php.net/rfc/array_part
25. 27/25
Ami kimaradt, de szerintem igény
lenne rá
● AST alapú parser
– https://wiki.php.net/rfc/ast_based_parsing_compilation_process
● Natív, teljes körű Unicode támogatás
● Typehint skaláris típusokra is
– A Fatal error-os formában nem valószínű hogy valaha is bekerül.
● Kivétel alapú hibakezelés
– Nem tudja kiváltani a jelenlegi infrastruktúrát, plusz nem illeszkedik a multiparadigmás imázsba.
– https://github.com/ircmaxell/ErrorExceptions
● Chainelhető user error/exception handlerek
– Mint ahogy pl. most az spl autoloader működik.
● Skalár objektek
– https://github.com/nikic/scalar_objects
● Thread kezelés
– http://pecl.php.net/package/pthreads
● PDO2
26. 27/26
Visszafelé nem(teljesen) kompatibilis
változások
● ext/mysql (ext/mysqli javasolt helyette)
● mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() and mcrypt_ofb() (mcrypt_generic/mdecrypt_generic
használható helyette).
● Bugfix: unpack("a5", "str00") 5.5 előtt 3 hosszú stringet adott vissza, 5.5től a helyes 5 hosszú NUL
paddolt stringet, a 'Z' kapcsolóval elérhető a régi hibás viselkedés továbbra is.
● A függvények, osztályok és konstans nevek belső case insensitive-ségének biztosítása mindig ASCII
szabályok szerint történik ezentúl (pl. török locale-lel voltak korábban problémák:
https://bugs.php.net/bug.php?id=18556).
● Windows XP és 2003 támogatása megszűnik.
● php_logo_guid(), php_egg_logo_guid(), php_real_logo_guid(), zend_logo_guid() függvények
eltávolításra kerültek, helyettük data url-ek használata javasolt.
● --with-curlwrappers configure kapcsoló és az ehhez tartozó experimental kód eltávolításra került.
● '@/path/to/file' típusú curl fájlfeltöltés ellenjavalttá vált.
● IntlDateFormatter::setTimeZoneID() és datefmt_set_timezone_id() ellenjavalttá vált. A
IntlDateFormatter::setTimeZone() vagy a datefmt_set_timezone() használható helyette.