Jeśli ktoś uważał, że język PHP nie rozwija się, wegetuje… Był w błędzie. Tylko 15 miesięcy zajęło developerom wydanie stabilnego następcy wersji PHP 5.4.
A zmian, nowości oraz ewolucji nie brakuje w wersji PHP 5.5.
Opcode cache wbudowane!
Po tylu latach używania różnych alternatyw (w moim wypadku APC – czy warto korzystać?) doczekaliśmy się w końcu wbudowanego Opcode cache. Dokładniej to Zend Optimizer+ został wbudowany w jądro PHP 5.5.0.
Można powiedzieć, że dzięki temu zabiegowi PHP bardzo przyspieszyło – sporo osób nie wiedziało o Opcode cache, lub nie radziło sobie z jego instalacją. Prawdopodobnie dla zwykłego programisty wrażenie jakie odniesienie po instalacji PHP 5.5 będzie niesamowite przyspieszenie działania PHP. A reszta może zapomnieć o dodatkowej instalacji APC, lub pilnowania aktualności wersji tej paczki PECL. Przykładowa konfiguracja Opcode w php.ini:
1 2 3 4 5 6 |
opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=1 opcache.enable_cli=1 |
Constant dereferencing
To jest jedna z tych rzeczy, na którą czekałem. Bardzo wiele razy trzeba było tworzyć zmienną, by móc odwołać się do n-tego elementu lub znaku. Nigdy więcej 🙂
1 2 |
echo "Hello"[3]; // wynik: 'l' echo [1,2,3,4][2]; // wynik: '3' |
List w foreach
Do tej pory sposób korzystania z list() był delikatnie mówiąc – brzydki. Było to bardzo nielogiczna operacja moim zdaniem i z niej nie korzystałem. Od nowej wersji natomiast możemy skorzystać z tej funkcji bezpośrednio w wywołaniu foreach. Przykład z wiki RFC:
1 2 3 4 5 6 7 8 |
$users = [ ['Foo', 'Bar'], ['Baz', 'Qux'], ]; foreach ($users as list($firstName, $lastName)) { echo 'First name: ' . $firstName . ', last name: ' . $lastName . PHP_EOL; } |
Słowo kluczowe finally
W końcu finally można dodać do bloku try…catch i mamy gwarancję, że dany fragment zostanie zawsze wykonany. Do tej pory wyglądało to tak, że używaliśmy pięknej obiektówki, a później nagle trach fragment znikąd, w którym czyściliśmy niektóre operacje lub robiliśmy przekierowanie – nigdy więcej.
1 2 3 4 5 6 7 8 9 10 11 |
try { $person = new Person(); if(!$person) { throw new Exception(); } } catch (Exception $e) { // Handle exception } finally { Redirect::url('/'); } |
Password Hashing API
W końcu nie musimy samemu tworzyć funkcji hashujących dla haseł, ani martwić się czy użyty algorytm jest odpowiednio dobry. Od teraz mamy do dyspozycji wbudowaną funkcję hashującą password_hash oraz funkcję sprawdzającą poprawność hasha password_verify. Domyślny algorytm to bcrypt, który generuje hash 60 znakowy. Przykład:
1 2 3 4 5 6 |
$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT); if (password_verify('rasmuslerdorf', $hash)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; } |
Generatory
Generatory mają nam ułatwić tworzenie przeróżnych iteratorów. Tworzy się je jak normalne funkcje, ale nie używa się słowa return. Zamiast return w generatorze używamy yield w następujący sposób:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function daysOfTheYear() { $year = date('Y'); $current = new DateTimeImmutable($year . '-01-01'); do { yield $current; $current = $current->modify('+1 day'); } while ($current->format('Y') === $year); } foreach(daysOfTheYear() as $dt) { // ... } |
Widzicie jakie to proste? Można powiedzieć, że w yield odkładają nam się kolejne wartości dopóki funkcja nie przestanie działać. Taki generator zwraca nam najzwyklejszą tablicę obiekt Generator, który można swodobnie iterować i traktować jak najzwyklejszą tablicę.
Dodatkowo zaktualizowano GD do wersji 2.1, empty() może przyjmować dowolne wartości (również bool) oraz wprowadzono wiele usprawnień.
Pamiętajmy – wydanie PHP 5.5. spowodowało, że gałąź PHP 5.3 została zamknięta. Od teraz będą w niej wyłącznie łatane luki bezpieczeństwa.
Źródło: php.net