Чем отличаются версии php
Эволюция PHP — от 5.6 до 8.0 (Часть 1)
Перевод статьи подготовлен в преддверии старта курса «Backend-разработчик на PHP».
Шпаргалка по изменениям в PHP v7.x
После релиза PHP версии 7.3 я решил уделить больше внимания развитию PHP: что собственно развивается и в каком направлении искать понимание потенциала и оптимизации этого невероятно популярного языка программирования.
PHP 7.0
Анонимный класс может использоваться вместо именованного класса:
Когда класс не нужно документировать
Когда класс во время выполнения используется только один раз
Функция целочисленного деления — безопасный способ деления (даже на 0).
Возвращает целочисленный результат деления первого операнда на второй. Если делитель (второй операнд) равен нулю, функция пробрасывает EWARNING и возвращает FALSE.
Используется для оптимизации и упрощения операций сравнения.
В теле функций генераторов разрешен следующий новый синтаксис:
Повышение производительности
PHP 7 почти вдвое быстрее, чем PHP 5.6.
Значительное сокращение использования памяти
Как видно из диаграмм, PHP 7.0 стал громадным шагом вперед с точки зрения производительности и использования памяти. Для страницы с запросами к базе данных версия 7.0.0 более чем в 3 раза быстрее, чем 5.6 с включенным opcache в 2.7 раза быстрее без opcache! С точки зрения использования памяти разница тоже существенная!
Классы исключений были реструктурированы к более контринтуитивной схеме именования, которая приведет к меньшей путанице, особенно для новых пользователей.
⚠ Внимание! Вы можете реализовать Throwable только через Error и Exception .
С этим нововведением глобально зарезервированные слова стали полу-зарезервированными:
PHP 7.1
В отличие от других типов, которые принудительно применяются при вызове функции, этот тип проверяется во время компиляции, что означает, что ошибка возникает без необходимости вызова функции.
Функция с типом возврата void или void функция может либо возвращать неявно, либо иметь оператор возврата без значения:
Параметры, объявленные как iterable могут использовать null или массив в качестве значения по умолчанию.
Синтаксис квадратных скобок для list()
Версии PHP: зачем их обновлять и чем они различаются
Почти 80% всех существующих сайтов, по данным W3Techs, работают на базе языка программирования PHP. Значительную их часть составляют сайты, созданные с помощью WordPress и других популярных CMS. Однако, несмотря на такую распространнёность, не все владельцы сайтов знают о необходимости переходить с устаревших версий PHP на более актуальные. Что отражается на качестве работы сайтов.
Кратко о версиях PHP
Какие версии PHP считаются актуальными, а какие — устаревшими? Чтобы разобраться в этом, рассмотрим этапы жизненного цикла версий этого языка:
Релиз. Выпускается новая версия PHP, которая прошла все этапы предварительного тестирования и подходит для использования в «боевых условиях».
Активная поддержка. В течение двух лет после релиза версия продолжает совершенствоваться. Выходят регулярные обновления, вносятся корректировки и исправляются баги. Обеспечивается полная безопасность версии.
Минимальная поддержка. Ровно через два года после релиза работа по развитию версии прекращается. В течение следующего года происходят только критические обновления, касающиеся серьёзных угроз безопасности.
Завершение жизненного цикла. Через год критических обновлений защиты версия перестаёт поддерживаться полностью. Однако ей можно продолжать пользоваться, но уже на свой страх и риск.
На момент публикации этого материала продолжают поддерживаться три версии PHP:
7.4 (дата релиза — 28 ноября 2019 года, самая актуальная версия);
7.3 (дата релиза — 6 декабря 2018 года, активная поддержка подходит к концу);
7.2 (дата релиза — 30 ноября 2017, активно не поддерживается, важные обновления безопасности скоро перестанут выходить).
Версии 7.1, 7.0 и все версии PHP 5 больше не обновляются. А уже в конце 2020 года самой актуальной станет версия 8.0.
А что насчёт PHP 6? Если вы не знаете, почему шестые версии здесь не упоминаются, то сейчас поясним.
PHP 6: строили, строили, но не построили
На разработку версии 6.0 было потрачено немало времени. Предполагалось, что самым важным нововведением в ней станет поддержка символов Юникода, благодаря которой возможности языка были бы расширены. Однако разработчики PHP 6 столкнулись со множеством трудностей, что вынудило их постепенно отказаться сначала от внедрения Юникода, а затем и вообще от запуска версии 6.0.
Пока шла работа над PHP 6, на эту тему было выпущено немало статей и книг. И представление о PHP 6 как о версиях языка с внедрённым Юникодом уже успело устояться в IT-сообществе. Поэтому новому поколению языка, пришедшему на смену PHP 5, было решено присвоить номер 7.
PHP 7: обновление, которое ждали больше 10 лет
Первая версия PHP 7 была представлена ещё в конце 2015 года, но до сих пор почти половина сайтов в мире, по информации WTechs, не перешли на PHP 7 и остаются на PHP 5. Каких возможностей лишены те, кто всё ещё не обновился?
С заботой о пользователях мобильных гаджетов разработчики также поработали над исполнением движка и уменьшили потребление памяти при работе PHP. Также с помощью Abstract syntax tree (AST) операционный код стал более производительным. И в целом код на PHP 7 стал чище, понятнее и удобнее.
Помимо внедрения нововведений, в версии 7.0 изменили или вовсе убрали устаревшую и ненужную функциональность. С одной стороны, это несколько нарушило совместимость языка с ранее созданным и необновлённым ПО. Но с другой, принятые меры позволили сделать настоящий прорыв в развитии PHP.
PHP 8: взгляд в будущее
Версия 8.0 активно разрабатывается в данный момент, но о ней уже кое-что известно. Планируется, что в новейших версиях PHP будет генерироваться меньше кода. Для этого будет использоваться технология JIT (Just in Time). С её помощью при выполнении приложения весь код будет не компилироваться заново, а частично заимствоваться из уже скомпилированных версий.
Компиляции станет меньше и благодаря технологии FFI (Foreign Function Interface), которая упрощает вызов функций, написанных на разных компилируемых языках программирования. Благодаря JIT и FFI производительность PHP 8 должна ощутимо повыситься по сравнению с PHP 7.
Релиз первой альфа-версии 8.0 намечен на лето этого года. Затем традиционно будут представлены несколько альфа- и бета-версий, а также релизов-кандидатов, после чего 3 декабря 2020 года ожидается выпуск финального варианта.
Кратко об обновлении PHP
Какую версию PHP лучше всего использовать? Конечно же, самую актуальную на данный момент. Тогда вы всегда будете получать:
О работе с PHP на VPS мы пока говорить не будем, так как для этого нужен отдельный материал. Поэтому дальше мы дадим рекомендации пользователям виртуального и специализированного хостинга.
Узнайте, какая версия PHP используется на вашем сайте. Эта информация доступна в настройках веб-сервера: например, на хостинге «Джино» они расположены здесь). Владельцы сайтов на WordPress могут увидеть текущую версию PHP в панели администратора, в разделе Инструменты / Здоровье сайта / Информация. Также вы можете написать этот скрипт, разместить его в файлах сайта и обратиться к нему из браузера:
В результате будет показана информация о версии.
Если ваша текущая версия PHP не входит в число поддерживаемых, взвесьте все «за» и «против» перед обновлением. Ведь чем старее скрипты вашего сайта, тем сложнее может быть перейти на поддерживаемую версию PHP. Тем, кто готов обновиться, нужно сделать следующее:
Убедитесь, что у вас сохранена свежая резервная копия файлов сайта.
Проверьте совместимость используемого ПО, фреймворков, библиотек, плагинов с выбранной вами версией PHP. Если что-то из этого не совместимо с ней, убирайте и заменяйте на более современные аналоги.
Измените версию PHP на хостинге, через настройки сервера в контрольной панели или через запрос в техподдержку.
После обновления протестируйте все функции сайта, при тестировании проверяйте лог на предмет «Fatal error» и других ошибок, которых раньше не было. Если все функции работают, а на страницах сайта появляются предупреждения PHP — отключите отображение ошибок.
Если после обновления возникли серьёзные нарушения в работе сайта, верните старую версию PHP. Разберитесь в проблемах сами или обратитесь за помощью к специалистам.
Чтобы переход на новую версию PHP никогда не составлял большого труда, постоянно адаптируйте свой сайт под последнюю поддерживаемую версию языка. А также используйте регулярно обновляемые плагины и ПО, избавляясь от всего, что не обновлялось больше года и не подлежит использованию с актуальными версиями PHP.
Введение в PHP 7: Что добавлено, что убрано
Постойте, а где же PHP 6?
Если вы какое-то время не работали с PHP, вы можете удивиться, куда же пропал PHP 6, почему мы перепрыгнули с PHP 5 сразу на PHP 7? Что ж, я буду краток, выпуск PHP шестой версии не состоялся. Главной особенностью версии 6 была поддержка символов Unicode, поскольку в основном PHP используется в веб-разработке, вебу же нужна поддержка Unicode, поэтому её реализация имела смысл.
Идея была в том, чтобы реализовать поддержку Unicode непосредственно в ядре. Такой подход должен был расширить возможности языка — от использования глупых эмоджи в качестве имен переменных и функций, до мощной функциональности интернациональных строк. Например, в случае, когда другой язык использует заглавные и прописные буквы отлично от английского языка или же при конвертации имени на китайском в имя на английском языке.
PHP6 был амбициозным, но отстойным. Посему мы занялись PHP7, в процессе пропустив шестую версию.
К сожалению, этот амбициозный план имел куда больше проблем, чем ожидалось. Большая часть кодовой базы должна была быть портирована для поддержки Unicode, как в случае ядра, так и в случае важных расширений, что оказалось утомительным и непростым делом. Это замедлило процесс разработки других возможностей языка, что расстроило многих PHP-разработчиков. Появились и другие барьеры, что привело к падению интереса к разработке встроенной поддержки Unicode, а со временем проект и вовсе оказался заброшенным.
А поскольку масса ресурсов, таких как книги и статьи, были написаны с использованием названия PHP 6 и поддержки Unicode, новой версии было решено присвоить имя PHP 7 — просто для того, чтобы избежать недопонимания.
Как бы там ни было, хватит копаться в мрачном прошлом. Давайте взглянем на то, что нового у нас появилось в PHP 7.
Войны за производительность, PHP 7 vs. PHP 5
Практически все обновления привносили небольшие улучшения производительности. Однако на этот раз производительность PHP, по сравнению с более ранними версиями, выросла куда более существенно, став одной из наиболее привлекательных особенностей PHP 7. Это было частью проекта “PHPNG” (“php new generation” или “php нового покления”, — прим. переводчика), затронувшего собственно сам Zend Engine.
Рефакторинг внутренних структур данных и добавление дополнительного этапа перед компиляцией кода в виде абстрактного синтаксического дерева — Abstract Syntax Tree (AST), привели к превосходной производительности и более эффективному распределению памяти. Цифры сами по себе выглядят многообещающе — тесты, выполненные на реальных приложениях показывают, что PHP 7 в среднем вдвое быстрее PHP 5.6, а также использует на 50% меньше памяти вовремя обработки запросов, что делает PHP 7 сильным соперником для компилятора HHVM JIT от Facebook. Взгляните на эту инфографику от Zend, которая отображает производительность для некоторых общеизвестных CMS и фреймворков.
PHP 7 выглядит знакомо, но он “заточен” под производительность. Усовершенствованный Zend Engine и итоговый прирост производительности привели к огромной разнице между ним и предыдущей версией.
Уменьшение потребления памяти позволяет более слабым компьютерам лучше обрабатывать запросы, предоставляя возможность выстраивания микросервисов вокруг PHP. Внутренние изменения, в частности реализация AST, также открывает возможности для будущих оптимизаций, которые могут ещё больше увеличить производительность. Новая собственная реализация JIT-компилятора разработана с намерением развития в будущих версиях.
Синтаксический сахар в PHP 7
В PHP 7 появилось несколько новых синтаксических штучек. Почему бы и не расширить некоторые возможности самого языка, если они предлагают лучший или более легкий способ написания приятного глазу кода?
Группировка объявлений импорта
Теперь мы можем группировать объявления импорта классов, находящихся в одном пространстве имён, в одной строке. Это поможет нам выровнять декларации неким, наделенным смыслом, образом или же просто сэкономит пару байт вашего кода.
В PHP 7 можно написать:
Или же, если вы предпочитаете многострочный стиль:
Null-коалесцентный оператор
Решает распространенную проблему в PHP. Она возникает в случае, если мы хотим присвоить значение переменной, которое присвоено другой переменной, но если последней переменной значение не было присвоено, то присвоить некое явное значение. Часто проявляется при работе с пользовательским вводом.
Можно использовать с цепочкой переменных:
Оператор “космический корабль”
В этом случае мы можем предпринимать различные действия в зависимости от того, как различаются значения:
Сравниваемые значения могут иметь тип integer, float, string и даже быть массивами. Как разные значения сравниваются друг с другом? Смотрите в документации.
Новое в PHP 7
Конечно, в PHP 7 появилась новая, впечатляющая функциональность.
Типы скалярных параметров и подсказки (hints) по возвращаемым типам
В PHP 7 расширили ранее существовавшее объявление параметров в методах (классах, интерфейсах и массивах) путем добавления четырех скалярных типов — целого (int), с плавающей запятой (float), логического (bool) и строкового (string) в качестве возможного типа параметра.
Кроме того, опционально мы можем указать тип результата, возвращаемого функцией или методом. Поддерживаются типы bool, int, float, string, array, callable, имя класса или интерфейса и parent (для методов класса).
Объявление типов позволит строить прозрачные приложения, избегая передачи и возврата неверных значений при работе с функциями. Другие плюсы — появление анализаторов статического кода и IDE, предлагающих более ясное отображение кода при отсутствии документирующих примечаний DocBlocks.
Поскольку PHP слабо типизированный язык, некоторые значения параметров и возвращаемых типов будут приводиться исходя из контекста. Если мы передаем значение “3” в функцию, имеющую объявленный параметр типа int, интерпретатор будет рассматривать его как целое и не сгенерирует ошибку. Если вас не устраивает такое поведение, вы можете работать в строгом режиме — strict mode — путем добавки соответствующей директивы.
Она устанавливается отдельно для каждого файла, поскольку глобальная опция разделила бы хранилища кода на такие, в которых файлы разрабатывались с включенной опцией и те, где она была отключена, что привело бы к непредсказуемому поведению при работе с кодом из двух хранилищ с разными настройками.
Исключения движка
С появлением исключений уровня ядра, фатальные ошибки, которые ранее могли привести к остановке выполнения скрипта, теперь могут быть легко перехвачены и обработаны.
Ошибки, такие как вызов несуществующего метода, теперь не остановят скрипт, вместо этого будет сгенерировано исключение, которое можно обработать в блоке try catch, что явно улучшает обработку ошибок в вашем приложении. Это важно для некоторых типов приложений, серверов и демонов, поскольку фатальные ошибки, в противном случае, вполне могли привести к необходимости их рестарта. Тесты в PHPUnit также должны стать более удобными в использовании, поскольку фатальные ошибки могли уронить весь тестировочный проект. Исключения, в отличие от ошибок, могут быть обработаны для каждого теста отдельно.
PHP 7 выглядит и ощущается знакомым инструментом, но он нацелен на высокую производительность. Переработанный Zend Engine и прирост скорости работы приводят к большим отличиям от предыдущей версии.
В PHP 7 появилось достаточно много новых классов исключений, призванных обрабатывать типы ошибок, с которыми вы можете столкнуться. Для обеспечения совместимости между версиями, добавлен новый интерфейс Throwable, он может быть реализован как исключениями уровня ядра, так и пользовательскими исключениями. Такой подход реализован с целью недопущения наследования базового класса исключений исключениями ядра, что привело бы к появлению исключений в прежде написанном коде, которых ранее не было.
До PHP 7 такой код привел бы к фатальной ошибке исполнения скрипта:
Анонимные классы
Анонимные классы — двоюродные братья анонимных функций, которые вы могли использовать при создании функциональности коротких и ясных объектов. Анонимные классы легко создаются и используются так же, как и обычные объекты. Вот пример из документации.
Использование анонимного класса:
Анонимные классы полезны при тестировании юнитами, в частности при мокинге (имитации поведения реального объекта — прим. переводчика) при тестировании объектов и сервисов. Их наличие позволит нам избежать использования больших мокинг-библиотек и фреймворков путем создания простого объекта, поддерживающего интерфейс, который мы можем использовать для мокинга.
Функции CSPRNG
Синтаксис Escape-кода для Unicode
В отличие от многих других языков, до PHP версии 7, в PHP не было способа указать в строке escape-последовательность для Unicode символа. Теперь с помощью escape-последовательности \u можно генерировать такие символы с помощью их кода из набора UTF-8. Это лучше, чем непосредственная вставка символов, лучше контролируются невидимые символы и символы, имеющие графическое отображение отличное от значения:
Помните, что код, ранее работавший и использовавший пару символов \u, не будет корректно работать в версии 7 из-за изменившегося поведения.
Обновленные генераторы
Генераторы в PHP тоже получили несколько приятных новых возможностей. Теперь у них появился оператор return, который может быть использован для выдачи некоторого финального значения, актуального на момент завершения итерации. Его можно использовать для проверки корректности выполнения генератора. Например, узнать, выполнился ли он без ошибок, что позволит коду, вызвавшему генератор, корректно обработать любую возникшую ситуацию.
Больше того, генераторы могут возвращать и выдавать выражения из других генераторов. Таким образом, можно разбивать сложные операции на более простые.
Ожидания (expectations)
Ожидания (expectations) — улучшение функции assert() с сохранением обратной совместимости. Они позволяют использовать утверждения с нулевой стоимостью (zero-cost assertions) в рабочем коде и поддерживают возможность генерации пользовательского исключения при возникновении ошибки при отработке утверждения, что может быть полезно при разработке.
Функция assert() стала языковой конструкцией в PHP 7. Утверждения должны быть использованы только во время разработки и тестирования с целью отладки. Для настройки её поведения мы должны использовать две директивы.
Готовимся к переходу от PHP 5 к PHP 7
Появление версии PHP с номером 7 предоставило возможность изменения/обновления и даже удаления функциональности, которая считалась устаревшей или, некоторое время, уже ненужной. Такие изменения могут привести к проблемам с обратной совместимостью старых приложений.
Другая проблема, возникающая при появлении подобных версий, заключается в том, что библиотеки и фреймворки, которые для вас важны, могут не иметь обновлений, совместимых с новым релизом. Команда разработчиков PHP пыталась вносить изменения как можно в более высокой степени сохранив обратную совместимость для того, чтобы миграция на новую версию была как можно менее трудоёмкой. Относительно новые и вовремя обновляемые приложения, скорее всего, будет проще перевести на седьмую версию, тогда как для старых приложений необходимо взвешенное решение — стоят ли потраченные усилия полученных возможностей или же лучше и вовсе не обновляться.
Большая часть проблем невелики и могут быть легко устранены, в то время как другие могут потребовать куда больше времени и усилий. В целом, если вы видели предупреждения об использовании устаревших функций до установки PHP 7, то вы, скорее всего, увидите сообщения об ошибках, которые прекратят выполнение вашего приложения до их устранения.
Вас предупредили, так ведь?
Старые SAPI и расширения
Куда важнее тот факт, что были убраны старые и ненужные SAPI, такие как расширение mysql (но вы же его уже не используете, так?). Полный список расширений и возможностей, которые были удалены, вы можете посмотреть здесь и здесь.
Другие расширения и SAPI были портированы на PHP 7.
Очень много старых SAPI и расширений было убрано из PHP 7. Мы считаем, что за ними скучать не станут.
Однообразный синтаксис описания переменных
Это обновление привнесло некоторые изменения в части согласованности для конструкций переменная-переменная. Оно позволит использовать более прогрессивные выражения с переменными, что, в отдельных случаях, приведет к изменению поведения кода, как показано ниже:
Это изменит поведение приложений, получающих доступ к переменным указанным способом. С другой стороны, вы сможете выделывать вот такие фокусы:
Убраны тэги в старом стиле
Убраны или более некорректны открывающие/закрывающие тэги
Заменить их на корректные легко, но их использование в наше время выглядит несколько странно, не так ли?
Некорректные имена для классов, интерфейсов, трейтов
В результате добавлений, таких как типы возвращаемых значений и параметров, классы, интерфейсы и трейты больше не могут именоваться такими именами:
Подобное именование может привести к некорректной работе существующих приложений и библиотек, но легко поддаётся исправлению. Следующие имена тоже нежелательно использовать в выше названном качестве, поскольку они зарезервированы на будущее:
Воздержитесь от использования этих слов в качестве имен, и вы сэкономите себе время впоследствии.
Полный список изменений, приводящий к несовместимости, можно посмотреть здесь.
Также вы можете использовать php7cc, этот инструмент проверит ваш код и отобразит потенциальные проблемы, которые могут возникнуть при переходе на PHP 7.
Но нет пути лучше, чем установить PHP 7 и увидеть всё воочию.
Потенциальные проблемы совместимости PHP 7
Совместимость инфраструктуры PHP 7
Многие сервисы хостинга добавили поддержку PHP 7. Это хорошая весть для провайдеров shared-хостинга, поскольку возросшая производительность позволит им увеличить число клиентских веб-сайтов без обновления железа, уменьшив текущие расходы и увеличив доходы. Что до клиентов, то они не должны ожидать резкого увеличения производительности в этих условиях, да и, говоря откровенно, shared-хостинг в любом случае не опция в случае приложения, ориентированного на производительность.
С другой стороны, сервисы, предлагающие частные виртуальные сервера или выделенные сервера, получат все прелести роста производительности. Некоторые PaaS-сервисы, такие как Heroku, давно поддерживают PHP 7, другие же, типа AWS Beanstalk и Oracle OpenShift, плетутся позади. Убедитесь на веб-сайте вашего PaaS-провайдера, есть ли у него поддержка PHP 7 или же она планируется в ближайшем будущем.
IaaS-провайдеры позволяют вам контролировать “железо” и устанавливать PHP 7 (или скомпилировать, если вам это больше нравится). Пакеты PHP 7 уже доступны для большинства IaaS-сред.
Совместимость программного обеспечения с PHP 7
В довесок к совместимости с инфраструктурой, вам также необходимо помнить о потенциальных проблемах совместимости с программным обеспечением. Известные CMS типа WordPress, Joomla и Drupal уже добавили поддержку PHP 7. Основные фреймворки, такие как Symfony и Laravel тоже сделали это.
Однако пришло время предостережений. Эта поддержка не распространяется на код третьих лиц в виде дополнений, плагинов, пакетов и т.п., к чему обращается ваш CMS или фреймворк. Проблемы могут быть, и ваша задача заключается в том, чтобы убедиться — всё готово для работы под PHP 7.
Для активных, поддерживающихся репозиториев, это не должно быть проблемой. Но заброшенные репозитории без поддержки PHP 7 могут сделать всё ваше приложение непригодным к использованию.
Будущее PHP
В PHP 7 был убран устаревший код, а также был дан зеленый свет новым возможностям и будущим улучшениям в области эффективности. Плюс, PHP вскоре должен получить оптимизацию производительности. Несмотря на частичную потерю обратной совместимости с предыдущими версиями, большинство возникающих проблем легко решаемы.
Библиотеки и фреймворки мигрируют на PHP 7, что приводит к появлению их новых версий. Я призываю вас попробовать семёрку и оценить полученные результаты. Может быть, ваше приложение уже совместимо с новой версией и готово работать на PHP 7, получая выгоды от его использования.