Dzisiaj miała być dostępna oficjalna wersja PHP 7.0. Niestety z powodu znalezionych błędów została opublikowana kolejna, ostatnia wersja Release Candidate (PHP 7.0 RC7). W następnym tygodniu powinna być już oficjalna wersja.
Sporo osób zastanawia się, czy przejść od razu po premierze PHP 7.0 na najnowszą wersję. Ale to nie powinno być Wasze pierwsze pytanie.
Pierwsze pytanie powinno brzmieć: czy moja aplikacja/framework zadziała poprawnie z PHP 7.0?
Musimy pamiętać, że zysk wydajności i wprowadzone nowe możliwości zostały uzyskane poprzez poważne zmiany w samym rdzeniu PHP. Dlatego nie tylko musicie zweryfikować poprawne działanie Waszych rozwiązań w PHP, ale także powinniście zweryfikować listę rozszerzeń do PHP (PECL) z jakich korzystacie, bo nie wszystkie muszą zadziałać.
Z tego już nie skorzystasz
W PHP 7.0 jest spora ilość niekompatybilności w stosunku do poprzedniej wersji (5.6). Jeśli do tej pory ignorowaliście wszelki E_DEPRECATED powinniście jak najszybciej zacząć poprawiać zgłaszane problemy. Wraz z przejściem na PHP 7.0 wszelkie E_DEPRECATED zostaną zamienione w fatal error i uniemożliwią poprawne działanie aplikacji.
W PHP 7.0 nie skorzystacie również z następujących funkcji, które zostały usunięte:
- call_user_method()
- call_user_method_array()
- set_magic_quotes_runtime()
- set_socket_blocking()
- dl()
- funkcje GD Type1
Zrobiono również porządek z aliasami i następujące zostały usunięte:
- mcrypt_generic_end()
- mcrypt_ecb()
- mcrypt_cbc()
- mcrypt_cfb()
- mcrypt_ofb()
- datefmt_set_timezone_id()
- IntlDateFormatter::setTimeZoneID()
Największe nowości
Największą zmianą, zauważalną dla wszystkich jest duży wzrost wydajności. Średnio jest to 2x krotne zwiększenie szybkości oraz zmniejszenie zużycia pamięci.
Jeśli tylko Twoja biblioteka, framework, aplikacja wspiera PHP 7.0 to jest to bardzo dobry powód do aktualizacji.
Wordpress, Zend Framework 2, Symfony 2.8/3.0 w pełni wspierają już PHP 7.0.
W nowej wersji otrzymamy także spójne wsparcie dla 64-bitów, jak również:
- zastąpienie wielu fatal errors poprzez wyjątki PHP
- usunięcie starych i niewspieranych SAPI i rozszerzeń (szczególnie ext/mysql i ext/ereg, pełna lista)
- Nowy operator ?? (The null coalescing operator)
1234//PHP 5.6$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';//PHP 7.0$username = $_GET['user'] ?? 'nobody'; - Nowy operator < => (Combined comparison Operator)
123echo 1 < => 1; // 0echo 1 < => 2; // -1echo 2 < => 1; // 1 - deklaracje zwracanego typu dla funkcji
123456function arraysSum(array ...$arrays): array{return array_map(function(array $array): int {return array_sum($array);}, $arrays);} - Scalar type declarations
123456function sumOfInts(int ...$ints){return array_sum($ints);}var_dump(sumOfInts(2, '3', 4.1)); //return int(9) - klasy anonimowe
- filtrowanie podczas unserialize()
- możliwość grupowaniu deklaracji use
123456//PHP 5.6use some\namespace\ClassA;use some\namespace\ClassB;use some\namespace\ClassC as C;// PHP 7.0use some\namespace\{ClassA, ClassB, ClassC as C};
Nowości przez ostatnie lata były mocno wertowane, ale warto sobie przypomnieć pełna listę nowości, jak również rzucić okiem na zaimplementowane RFC.
Live test
Co kilka wersji RC robiłem na bieżąco testy jak działa PHP 7 z aplikacjami na serwerze. Poniżej chciałbym przedstawić tylko małą próbkę, abyście zdawali sobie sprawę ze skali zmian w prędkości.
Czas uruchomienia konsoli Symfony 2.6 przyspieszył x2.5:
- PHP 5.6 Time: 0,700 seconds
- PHP 7.0 Time: 0,279 seconds
Czas uruchomienia unit testów dla aplikacji (PHPUnit) przyspieszył x1.5:
- PHP 5.6 Time: 8.31 seconds, Memory: 40.25Mb
- PHP 7.0 Time: 5.54 seconds, Memory: 22.00Mb
Większość popularnych rozszerzeń PECL już w pełni współpracuje z PHP 7.0 RC6:
+ memcached (branch: php7)
– memcached (branch: php7 with igbinary)
+ redis (branch: php7 with igbinary)
+ igbinary (branch: php7-dev-playground1)
+ xdebug (branch: master)
+ mongo (branch: PHP7)
+ amqp (branch: master)
Jedyny problem jaki mam to poprawna kompilacja rozszerzenia memcached z opcją igbinary. Niby nic, ale z tego powodu nie zadziała nam opcja serializacji danych Memcached::SERIALIZER_IGBINARY, która jest o wiele szybsza i wydajniejsza niż standardowe rozwiązanie wbudowane w PHP.
A jak Wasze przygody z PHP 7.0 RC?