PHP постоянно развивается, и только что мир увидело их последнее обновление — PHP 7.4. Производительность и скорость продолжают расти, в чём мы убедились ещё в предыдущих релизах PHP 7. Предварительная загрузка — одно из самых ярких обновлений. Эта возможность позволяет значительно ускорить выполнение скрипта и делает код чище и быстрее благодаря уменьшённому количеству строк кода. PHP является важным элементом всемирной паутины и используется более чем на 79% всех сайтов. Известные сайты, такие как Facebook, Википедия, WordPress и многие другие используют PHP.

Мы можем увидеть что скорость веб-сайтов WordPress увеличивается вдвое, если сравним сайты, работающие на PHP 5 и 7. От последней версии больше всего выиграют сайты на WordPress. В настоящее время PHP используют около 40 млн. сайтов. Этот график иллюстрирует производительность сайтов, которые активно используют PHP. В целом, PHP 7.4 выглядит довольно неплохо по сравнению с PHP 7.3: лучшая производительность, к которой добавились возможности FFI, функция предварительной загрузки и другие улучшения.

На следующем графике сравниваются общие результаты теста производительности 7.4 и более старых версий PHP. Постоянные ежегодные обновления PHP7 начали выходить с 2016 года: различные новые функции, возможность писать более чистый код, чтобы сделать язык более надёжным и удобным, если вы запускаете его на своём сайте и т.д. Давайте взглянем на некоторые модификации, которые появились с выходом версии PHP 7.4.

Полный список изменений можно посмотреть в их ченджлоге. Предварительная загрузка — позволяет загружать фреймворки и библиотеки в OPCache. Это действительно удобная функция, поскольку при каждом использовании файлов или библиотек необходимо загружать и связывать файлы по каждому запросу. Загружает файлы PHP и хранит их в памяти, чтобы они были готовы к любым поступающим запросам — вот, что делает эта фича! Предварительная загрузка контролируется единственной новой директивой php.ini: opcache.preload. Используя эту директиву, мы можем указать один файл PHP — тот, который будет выполнять задачу предварительной загрузки. После загрузки этот файл полностью выполняется и может предварительно загружать другие файлы, либо включая их, либо используя функцию opcache_compile_file (). Как уже было упомянуто выше, предварительно загруженные файлы будут закешированны в памяти opcache на неопределённый срок. Модификация их соответствующих исходных файлов не будет иметь никакого эффекта без перезапуска другого сервера. Поэтому, если вам захочется снова использовать эти предварительно загруженные файлы, они будут доступны для любых предстоящих запросов. PHP начал поддерживать распаковку аргументов (Оператор Spread), начиная с версии PHP 5.6. Теперь, с выходом 7.4, мы можем использовать оператор Spread в массивах. Синтаксис для распаковки массивов и Traversables в списки аргументов называется распаковкой аргументов. И чтобы это произошло, вам нужно всего лишь добавить три точки (…) в начале. Взгляните на этот пример: Теперь мы также можем расширить массив другим массивом с любого места, используя синтаксис оператора Spread. Более длинный пример: Кроме того, вы можете использовать его в функции. Как в этом примере: Также вы можете распаковывать массивы и генераторы, которые возвращаются функцией, прямо в новый массив: PHP 7.4 выводит следующий массив: Используя это выражение массива, операторы спреда должны иметь лучшую производительность по сравнению с 7.3 array_merge. Это связано с тем, что оператор Spread является языковой структурой, а array_merge — функцией. Другая причина заключается том, что оператор спреда поддерживает реализацию объектов Traversable, в то время как array_merge поддерживает только массивы. Ещё одна потрясающая и действительно удобная функция, которая появилась в 7.4 — это удаление индексированных массивов array_merge. Строковые ключи не поддерживаются. Больше никаких смещений индекса! Ещё одним преимуществом PHP 7.4 является функциии-генераторы. Разница между генератором и обычной функцией заключается в том, что функция-генератор будет перебирать столько значений, сколько необходимо, вместо того, чтобы возвратить одно значение. Итак, любая функция, содержащая ключевое слово yield, является функцией-генератором: В PHP 7.4 есть класс WeakReference, который позволяет сохранить ссылку на объект, не препятствующую его уничтожению. Слабые ссылки полезны для реализации кеш-подобных структур. Не путайте WeakReference с классом WeakRef или расширением Weakref. На данный момент PHP в основном использует инвариантные типы параметров и возвращаемого значения. Это подразумевает, что подтип параметра или тип возвращаемого значения также должны быть типа X, если метод имеет параметр или тип возвращаемого значения типа X. В PHP 7.4 появляется ковариантность (порядок от конкретного к общему) и контравариантность (обратный порядок) для типов возвращаемых данных и параметров. Давайте посмотрим на оба примера:
 Ковариантный тип возвращаемых данных: Контравариантный тип параметра: Функция контроля типов (type hints) появилась ещё в PHP 5. Она позволяет указать тип переменной, которая должна быть передана функции или методу класса. Начиная с PHP 7.2 стало возможным использовать type hints с типом данных объекта, что вселило надежду получить ещё больше возможностей.  В PHP 7.4 стаёт возможной поддержка следующего списка типов: Родительский тип может использоваться в классах, и ему не нужно иметь родительскую константу с параметром и типом возвращаемого значения. Поддерживаются все типы, кроме void и callable. Callable был удалён, потому что его поведение зависело от контекста; а void оказался недостаточно полезным, кроме того свою роль сыграла неясная семантика типа. Давайте взглянем на пример ниже. Класс PHP 7.3: В PHP 7.4 классы выглядят намного проще: Поддерживаемые типы PHP 7.4: Не секрет, что анонимные функции в PHP слишком громоздкие и продолжительные, даже если речь идёт о выполнении самых простых действий. Поэтому из JavaScript были позаимствованы стрелочные функции, или короткие замыкания. Их задача оптимизировать код PHP, улучшить его читаемость. Анонимные функции усложняют чтение кода с второстепенной функциональностью. Вот пример анонимной функции в PHP 7.3: А это легко читаемая стрелочная функция в PHP 7.4: Следовательно, вот насколько простыми являются стрелочные функции: Вы видите две функции $fn1 и $fn2. Код выглядит иначе, но функции передают идентичный результат. Это также наверняка будет работать с вложенными стрелочными функциями: Это что-то, что было за пределами возможностей версии 7.3. Родительская функция получает $c, в то время как дочерняя функция также получает $c от родительской функции. В PHP 7.4, внешний диапазон может стать доступным в дочерней функции. Синтаксис стрелочных функций позволяет нам использовать переменные, значения по умолчанию, параметры и типы возвращаемых данных, а также передавать и возвращать по ссылке и т. Д. Новый синтаксис является значительным улучшением языка, поскольку он позволяет нам создавать более читабельный и понятный код. Также стоит отметить, что стрелочные функции имеют самый низкий приоритет: На данный момент приоритет операторов “.”, “+” и “-” одинаков. Любая комбинация этих операторов будет решена слева направо. Взгляните на пример кода PHP 7.3: В PHP 7.4 сложения и вычитания всегда выполняются перед стрингой, поскольку “+” и “-” имеют приоритет над “.”: В отличие от большинства других языков, где тернарный оператор обрабатывается справа на лево, в PHP это происходит наоборот. Такое поведение часто сбивает разработчиков столку, поэтому было предложено использовать круглые скобки, вместо левой ассоциативности. Давайте посмотрим на следующий пример: В большинстве других языков это читается так: В то время как в PHP, это читается: Поскольку часто это оказывается не тем, чем планировалось, в результате мы получим ошибки. PHP 7.4 представил новые удобные функции для каждого PHP-разработчика. Сайты WordPress и их пользователи определённо выиграют от этих улучшений. Сокращение использования памяти и быстрое время выполнения — это лишь некоторые преимущества PHP 7.4 перед старыми релизами. PHP 7.4, безусловно, повысит как скорость, так и качество вашего рабочего процесса благодаря представленным стрелочным функциям, объявлению типов свойств первого класса и контролю типов, а также намного лучшей скорости. Head of Customer Success at Hostinger.com