последняя версия php какая
Состоялся релиз языка программирования PHP 8.0
26 ноября 2020 года состоялся релиз языка программирования PHP 8.0.
Сообщество разработчиков пояснило, что новая версия языка PHP содержит множество новых возможностей и оптимизаций, включая именованные аргументы, Union type, атрибуты, упрощенное определение свойств в конструкторе, выражение Match, оператор Nullsafe, добавлено включение JIT-компилятора и сделаны улучшения в системе типов, сравнении строк и чисел, обработке ошибок и консистентности.
Новая версия языка программирования PHP содержит ряд новых функций. Часть ранее используемых в предыдущих версиях PHP функций объявлены устаревшими.
Разработчики внесли в PHP 8.0 некоторые изменения, нарушающие обратную совместимость с предыдущими версиями языка программирования.
Для миграции с PHP 7.4.x на PHP 8.0.x создан специальный раздел на портале php.net. Разработчики просят ознакомиться с документацией и изменениями в PHP 8.0 перед переходом на новую версию, особенно в производственной среде.
Примечательно, что в начале июля 2020 года сервисный инженер и менеджер по проектам PHP в Microsoft Дейл Хирт (Dale Hirt) предупредил сообщество разработчиков PHP, что компания не собирается заниматься поддержкой новых версий PHP, включая 8.0 и выше, для Windows. Представитель сообщества разработчиков PHP ответил Microsoft, что они глубоко признательны компании за проделанную их специалистами работу по поддержке PHP на Windows на протяжении многих лет. Также в сообществе разработчиков PHP сообщили, что примут все необходимые меры, чтобы найти в ближайшее время альтернативный вариант для организации поддержки PHP 8.0 и выше для Windows, например, своими силами.
Статистика использования PHP
Первая ежегодная статистика 2021 используемых версий PHP от Packagist
Статистика использования PHP
Май 2021 г.
Вы можете легко выполнить базовый тест на предмет того, поддерживают ли ваши зависимости PHP 8, используя конфигурацию платформы Composer, запустив, например:
Не забудьте вернуть изменения composer.json, когда закончите данные тесты. Вот сводная диаграмма, охватывающая все наблюдения версий за последние семь лет.
Требования PHP в пакетах
Как и в прошлый раз, версии 7.3/7.4 продолжают набирать обороты, PHP 8 также имеет неплохой старт. Однако самой используемой версией PHP по-прежнему является 7.1. Согласно приведенным выше диаграммам, я бы сказал, что 7.3 по-прежнему является хорошим вариантом для любой библиотеки, которая хочет поддерживать поддержку большинства пользователей, но 7.4 предлагает вам приятные функции и почти на 50% адаптирована, так что это допустимый вариант для нового кода. Процент использование PHP 8 все еще слишком низкий, и вероятно, останется таковым до выпуска Ubuntu 22.04.
Требование PHP 7.2+ охватывает
90% пользовательской базы прямо сейчас, поэтому требовать меньшей версии уже больше нет необходимости, Composer 2.2, выходящий позже в этом году, скорее всего, потребует этого. Кстати, если вы не используете Composer 2, вам действительно стоит подумать об обновлении!
Веб-разработчик со стажем программирования более 9 лет, всегда в процессе учебы и созидания.
PHP 8 — какие возможности появятся в новой версии языка и как их использовать
Скриптовый язык PHP 26 ноября 2020 года обновится до новой основной версии — PHP 8, а 18 июня 2020 года уже вышла его первая альфа-версия. Подробно разбираем, какие функции появятся в новой версии языка, сильно ли увеличится производительность и какие изменения придется внедрить в свой код, чтобы запустить его на восьмой версии PHP.
Новые особенности
Разработчики языка отмечают, что PHP 8 до сих пор находится в стадии активной разработки, поэтому список новых функций со временем будет увеличиваться.
Union Types
Учитывая динамически типизированную природу PHP, существует множество случаев, когда использование типов объединения может быть полезным. Union Types представляют собой совокупность двух или более типов, которые указывают, что можно использовать любой из них.
Разработчики обещают улучшения в производительности PHP 8 в том числе благодаря стратегии компиляции JIT (just in time, «в нужный момент»). В JIT код сначала переводится в промежуточное представление, и только потом — в машинный код, зависящий от архитектуры. Это значит, что он в ходе исполнения будет превращаться в машинный код, который будет выполняться не виртуальной машиной Zend VM, на которой построен язык, а непосредственно на процессоре.
Nullsafe-оператор
Если вы работали с оператором объединения с null, вы уже знакомы с его недостатками: его нельзя применить в цепочке вызовов методов. Вместо этого вам нужны промежуточные проверки или придется полагаться на optional помощников, предоставляемых некоторыми платформами:
С добавлением nullsafe-оператора разработчик может видеть поведение методов, подобное поведению при объединению с null.
Именованные аргументы
Именованные аргументы позволяют передавать значения в функцию, указав имя этого значения. Это позволит разработчику не учитывать порядок значений, а также пропустить какие-нибудь необязательные параметры.
Атрибуты
Атрибуты — в других языках программирования известные как аннотации, предлагают новый способ добавить метаданные в классы, без необходимости парсить докблок-комментарии.
Вот пример того, как выглядят атрибуты:
Выражение соответствия
Выражение match можно назвать старшим братом выражения switch — оно может возвращать значения, комбинировать условия, и при этом не требует break операторов. Кроме того, match не выполняет никакого приведения типов.
Краткий синтаксис для объединения свойств класса и конструктора
В PHP 8 появится синтаксический сахар для создания объектов значений или объектов передачи данных. Вместо отдельного указания определения свойств класса и конструктора для них, PHP теперь может объединять их в один краткий синтаксис.
Вместо такого кода:
Теперь можно будет кратко писать вот так:
Новый тип возврата static
Новый тип mixed
С добавлением скалярных типов в PHP 7, обнуляемых — в PHP 7.1, и, наконец, — объединенных типов в 8.0, PHP-разработчики могут явно объявлять информацию о типе для большинства параметров функции, callable-функций, а также свойств класса. Тем не менее, PHP не всегда поддерживает типы, и, скорее всего, он иногда будет пропускать информацию о них. Это приводит к тому, что значение будет неоднозначным, когда отсутствует информация о типе.
Явный mixed тип позволит разработчикам добавлять типы в параметры, свойства класса и возвращаемые значения из функции, чтобы указать, что информация о типе не была забыта, а её просто нельзя указать более точно.
mixed сам по себе означает один из этих типов:
Обратите внимание, что mixed также может использоваться как параметр или тип свойства, а не только как тип возвращаемого значения.
Throw-выражения
В PHP оператор throw не может создавать исключения там, где были разрешены только выражения, например стрелочные функции, оператор объединения и тернарный оператор. После обновления PHP будет преобразовывать инструкцию throw в выражение, это расширит функциональность использования языка.
Наследование частными методами
Раньше PHP применял одинаковые проверки наследования для public, protected и private- методов. Другими словами: private методы должны были быть определены так же, как protected и public. При этом такое определение не имеет смысла, так как private методы не будут доступны дочерним классам.
Это обновление изменило поведение таких методов — теперь проверки наследования больше не выполняются для private методов. Кроме того, использование final private function и раньше не имело особого смысла, поэтому теперь оно вызовет предупреждение:
Weak maps
Слабая карта — это набор объектов, на которые в коде слабо ссылаются ключи, что может привести к их удалению сборщиками мусора. В PHP 8 добавляется класс WeakMaps для создания сохранения ссылки на объект, при этом она не препятствует удалению самого объекта.
Например, возьмем пример ORM — они часто реализуют кэши, где содержатся ссылки на классы сущностей, чтобы улучшить производительность отношений между сущностями. Эти сущности не могут быть собраны сборщиком мусора, пока кэш имеет ссылку на них, даже если кэш является единственной реальной ссылкой на них. Если теперь кэш будет использовать слабые ссылки и WeakMaps, то PHP сможет справляться с мусором. Особенно в случае с ORM, которые могут управлять несколькими сотнями, если не тысячами объектов в ходе запроса.
Пример использования WeakMaps в PHP 8:
:: class на объектах
Неименованные исключения
Всякий раз, когда вы хотели перехватить исключение до PHP 8, нужно было сохранить его в переменной независимо от того, использовали ли вы эту переменную или нет. Теперь можно перехватить исключения без указания переменной.
Если раньше программисту приходилось писать такой код:
То в PHP 8 это будет выглядеть уже так:
Завершающая запятая в списках параметров
Несмотря на поддержку висячей запятой в аргументах при вызове функций, она не поддерживалась в списке параметров при объявлении функции.
Создать DateTime объекты из интерфейса
Вы уже можете создать DateTime объект из DateTimeImmutable объекта. Однако наоборот в PHP было сделать очень сложно. Теперь в языке появился новый обобщенный способ конвертировать эти объекты друг в друга.
Новый Stringable интерфейс
Новая функция проверки str_contains()
Можно использовать вот это:
Новые функции str_starts_with() и str_ends_with()
Ещё две давно назревшие функции. str_starts_with() проверяет, начинается ли строка с другой строки, и возвращает логическое значение ( true/ false).
str_ends_with() проверяет, заканчивается ли строка другой строкой, и возвращает логическое значение ( true/ false).
Новая функция деления на 0 fdiv()
Новая функция get_debug_type()
Новая функция get_resource_id()
Ресурсы — это специальные переменные в PHP, ссылающиеся на внешние ресурсы. Например, соединение MySQL или обработчик файла — каждому из них присваивается идентификатор, хотя ранее единственным способом узнать, что это идентификатор, было преобразование ресурса в int :
PHP 8 добавляет get_resource_id() функции, делая эту операцию более очевидной и безопасной для типов:
Улучшение абстрактных методов трейтов
Трейты могут содержать абстрактные методы, которые должны быть реализованы классами, использующими их. При этом важно, что до PHP 8 сигнатура этих реализаций методов не проверялась. То есть раньше приходилось писать так:
PHP 8 будет выполнять правильную проверку сигнатуры метода при использовании признака и реализации его абстрактных методов. Это означает, что вам нужно написать теперь так:
Объект реализации token_get_all()
Изменения синтаксиса переменных
В этом обновлении изменились правила синтаксиса при работе с переменными в PHP. Например, при их разыменовывании.
Аннотация аргументов внутренней функции и типов возвращаемых значений
Теперь разработчики смогут добавлять информацию о типе внутренних функций. Это была давняя проблема языка, и, наконец, её удалось решить. Это означает, что внутренние функции и методы будут иметь полную информацию о типе в Reflection.
Запрет на выключение JSON
Исправления критических ошибок языка
Стандартизация ошибок разных типов
Изменение классификации некоторых предупреждений
Многие ошибки, которые ранее вызывали только предупреждения или уведомления, были преобразованы в правильные ошибки:
• Неопределенная переменная: Error исключение вместо Notice ;
• Неопределенный индекс массива: предупреждение вместо уведомления;
• Деление на ноль: DivisionByZeroError исключение вместо предупреждения;
• Попытка увеличить/уменьшить свойство «% s» не-объекта: Error исключение вместо предупреждения;
• Попытка изменить свойство «% s» не-объекта: Error исключение вместо предупреждения;
• Попытка назначить свойство «% s» не-объекта: Error исключение вместо предупреждения;
• Создание объекта по умолчанию из пустого значения: Error исключение вместо предупреждения;
• Попытка получить свойство «% s» не-объекта: предупреждение вместо уведомления;
• Невозможно добавить элемент в массив, так как следующий элемент уже занят: Error исключение вместо предупреждения;
• Невозможно сбросить смещение в переменной, не являющейся массивом: Error исключение вместо предупреждения;
• Нельзя использовать скалярное значение в качестве массива: Error исключение вместо предупреждения;
• Только массивы и Traversables могут быть распакованы: TypeError исключение вместо предупреждения;
• Указан неверный аргумент для foreach (): TypeError исключение вместо предупреждения;
• Недопустимый тип смещения: TypeError исключение вместо предупреждения;
• Недопустимый тип смещения в isset или empty: TypeError исключение вместо предупреждения;
• Недопустимый тип смещения в unset: TypeError исключение вместо предупреждения;
• Преобразование массива в строку: предупреждение вместо уведомления;
• Идентификатор ресурса #% d, используемый в качестве смещения, приведение к целому числу (% d): предупреждение вместо уведомления;
• Произошло смещение строки: предупреждение вместо уведомления;
• Смещение неинициализированной строки: % d: предупреждение вместо уведомления;
• Невозможно назначить пустую строку для смещения строки: Error исключение вместо предупреждения;
Оператор @ больше не глушит фатальные ошибки
Вполне возможно, что это изменение может выявить ошибки, которые были скрыты до PHP 8. Обязательно установите их на своих рабочих серверах display_errors=Off
Уровень сообщений об ошибках по умолчанию
Режим ошибки PDO по умолчанию
Текущий режим ошибок по умолчанию для PDO — беззвучный. Это означает, что при возникновении ошибки SQL, никакие ошибки или предупреждения не могут выдаваться, а также не генерируются исключения, если разработчик не реализует свою собственную явную обработку ошибок. Это обновление изменит ошибку по умолчанию, которая выдается на PHP 8. PDO::ERRMODE_EXCEPTION
Приоритет конкатенации
Это обновление появилось еще на PHP 7.4, но теперь оно официально вступает в силу. Если бы вы написали что-то вроде этого:
PHP ранее интерпретировал бы это так:
PHP 8 сделает так, чтобы он интерпретировался так:
Более строгие проверки типов для арифметических и побитовых операторов
До PHP 8 можно было применять арифметические или побитовые операторы к массивам, ресурсам или объектам. Это больше не возможно и выдаст TypeError :
Изменилась сигнатуры методов классов Reflection
На PHP 8 реализовано изменение трех сигнатур методов классов Reflection.
В руководстве к PHP 8 говорится, что если разработчики хотят использовать как обновленную версию языка, так и предыдущие, то допускается использование:
Стабильная сортировка
До PHP 8 алгоритмы сортировки были нестабильны. Это означает, что порядок равных элементов не был гарантирован. PHP 8 меняет поведение всех функций сортировки на стабильную сортировку.
Неустранимая ошибка для несовместимых сигнатур методов
Ошибки наследования из-за несовместимых сигнатур методов в настоящее время либо генерируют фатальную ошибку, либо предупреждение — в зависимости от причины ошибки и иерархии наследования. Теперь всегда будет выдаваться фатальная ошибка.
В Хекслете есть большая профессия «PHP-программист», которая подойдет как для начинающих разработчиков, так и для людей, которые понимают основу этого языка. Кроме того, для продвинутых программистов на Хекслете есть специальные курсы — «Веб-разработка на PHP» и «ООП В PHP».
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
PHP 8. Что нового?
Выход восьмой версии в ноябре 2020 — долгожданное событие для всего PHP-сообщества. Александр Пряхин, преподаватель онлайн-курса «PHP Developer», рассказал о самых ключевых важных нововведениях языка.
Статья является расшифровкой демо-занятия, который можно посмотреть по ссылке. Из нее вы узнаете о нововведениях в версии 8.0, что такое JIT и зачем он нужен, а также некоторые важные вещи про бенчмарки.
В настоящий момент актуальными являются 2 версии PHP — 7.4 и 8.0, версия 7.3 находится пока в режиме поддержки, более старые версии уже не поддерживаются. Версия 7.4 будет актуальна еще порядка двух лет, поэтому у вас будет достаточно времени, чтобы подготовиться к переходу на 8.0. Ниже вы можете увидеть график активной фазы и поддержки разных версий:
Немного о прошлом и PHP 7
Если вспоминать опыт перехода на 7 версию, то разница с «пятеркой», конечно, ошеломительная. Появилось много нововведений в плане движка именно PHP, он стал работать быстрее, выросла производительность, уменьшилось потребление по памяти:
Версия 5.5 была определенным компромиссом в ООП и энтерпрайзе. «Семерка» расставила все по местам, и сейчас PHP развивается в сторону Java: появляется много классической Java функциональности, причем язык остается интерпретируемым и компилируемым по своей сути.
Общий перечень значимых изменений, пришедших с «восьмеркой»:
Далее я остановлюсь подробнее на некоторых из них.
Именованные аргументы
У нас есть множество функций, которые принимают кучу аргументов на вход. Часто когда мы передаем то переменные, получается что мы только по названию переменной можем догадываться, что мы туда отдаем. Да, IDE научились нам подсказывать. Смотреть целый ворох параметров не всегда удобно. Но теперь можно указывать имя того параметра, который передается, что повышает читаемость кода.
Кстати, необязательно удалять запятую после последнего параметра. Это к ошибке не приведет.
Атрибуты
В других языках это называется аннотации. В предыдущих версиях использовались комментарии PHPDoc. В восьмерке теперь можно использовать структурированный способ указания метаданных в PHP.
Атрибуты предназначены только для добавления метаданных к классам и методам.
Они не должны и не могут использоваться для проверки ввода аргументов. У вас не будет доступа к параметрам, переданным методу в его атрибутах.
Объявление свойств в конструкторе
В «семерке» у нас был какой-нибудь класс, у которого был набор свойств. Мы их объявляли в шапке. Дальше в конструкторы приходили параметры, которые мы раскладывали по свойствам класса. При этом писалось очень много кода, что не всегда удобно, особенно если делать какой-нибудь паттерн-билдер, который предоставляет оболочку и ее постоянно приходится переписывать.
В «восьмерке» теперь можно писать синтаксисом: прямо в параметрах конструктора указывается, какие свойства будут у класса, какие у них дефолтные значения будут передаваться в конструктор. С одной стороны облегчает работу, но с другой — может ухудшиться читаемость. Причина этого то, что если раньше мы ожидали увидеть, какие свойства есть у класса в самом начале метода, то теперь это в конструкторе. Для того же билдера может пригодиться, но будет ли это распространено на все — покажет время, когда сообщество и команды будут пробовать внедрять это нововведение.
Выражение match
До «восьмерки» был switch, где при описании типов был риск попортить логику. В новой версии появился match. Внутри match version можно описать реакцию на каждый из входящих параметров. Причем здесь уже будут поддерживаться типы. Например, сюда может прийти значение строкового или float типа. И ошибок не будет, т.к. match использует строгое сравнение.
И стоит обратить внимание на union types, когда можно через вертикальную черту перечислять типы.
Выражение throw
Throw стал выражением. Это значит, что можно его кидать в стрелочных функциях, в тернарных операторах.
Например, есть вот такой тернарный оператор. Если там массив непустой, то сбрасываем и вызываем функцию reset. Если пустой, то теперь прямо здесь можно кидать исключение.
Nullsafe
Сокращение проверок на null. Для текучего интерфейса теперь можно ставить знак вопроса перед обращением к методу, и если один из цепочки вызовов вернул null, то вся цепочка становится null.
Saner string to number comparisons
При сравнении с числовой строкой PHP 8 использует сравнение чисел. Иначе число преобразуется в строку и используется сравнение строк.
В «семерке», если сравнивается 0 и строчка без цифр, получается true, в «восьмерке» теперь в таком случае вернется false, потому что строка не будет приводиться к числовому значению.
В плане типов это важное нововведение, т.к раньше, если вернулась строка, сравнивали ее с нулем, то теперь так делать нельзя.
Также во встроенных функциях теперь вместо Warning будет выдаваться TypeError в случае несоответствия типов.
Non-capturing catches
В PHP 8 можно ловить исключение в catch-блоке без переменной.
Иными словами, можно просто написать, какой тип исключений мы ловим, и если эту переменную никак не используем, то просто здесь говорим, что у нас выводится строка сообщением и все. То есть если мы не хотим никак обрабатывать эти данные, чтобы не засорять память, мы просто не используем здесь переменные.
Поиск по строкам
Вместо strpos можно задействовать str_contains
Использование ::class на объектах
Левоассоциативный тернарный оператор
Теперь такие вложенные «монстры» будут выдавать ошибку. Их давно уже пора было запретить, и наконец это сделали. Можно написать нормальные If-ы или использовать match.
Изменение приоритета оператора конкатенации
В восьмой версии поменялся приоритет оператора конкатенации. Если раньше сначала надо было конкатенировать, потом складывать, то сейчас конкатенация идет уже после сложения.
Валидация абстрактных методов в трейтах
JIT — главное нововведение PHP 8
JIT — компилятор Just In Time. Доступен с PHP 8 как расширение OpCache.
Компилирует операционный код в машинные инструкции во время выполнения.
Некоторые части кода будут не интерпретироваться в Zend VM, а выполнятся непосредственно на уровне процессора.
И собственно, польза JIT и состоит в том, чтобы обойти Zend VM. Дело в том, что Zend VM написан на C — это слой между Opcode и CPU. JIT использует Dynamic Assembler — библиотеку внутри Zend, чтобы наиболее часто используемые вещи транслировать в обход VM напрямую в процессор, за счет чего ускоряется работа ПО.
Получается вот такая схема работы:
То есть если мы видим, что у нас уже есть заранее скомпилированная история, мы сразу же кидаем в CPU и не передаем в Zend VM на выполнение.
Нововведение позволяет выигрывать InMemory операциям.
Бенчмарки
Проверим производительность версий 7.4 и 8.0 на виртуальной машине следующей конфигурации:
И скрипт, который генерирует 10 млн. рандомных хешей — просто для того, чтобы максимально нагрузить процессор.
По времени скрипт выполняется примерно одинаково, но «восьмерка» с включенным JIT ощутимо выигрывает по памяти.
Если говорить про веб-сайты, то тут для такого тестового стенда: VirtualBox, Homestead, 2GB RAM, 2x vCPU, SSD, WordPress, FakerPress, Nginx + PHP-FPM — будут следующие результаты:
Здесь по памяти сильно не выиграть потому что идет работа с базой данных, зато выигрыш идет по времени загрузки. Если на 7.4 страничка загружается за 0,161 с, то на 8.0 это занимает 0,04 с.
Что важно, JIT тут практически ни на что не влияет, т.к. вычислений в памяти минимум. В основном все ложится на input и output операции и начинает играть роль непосредственно оптимизация в новом движке.
Это основные моменты, которые пришли в PHP с восьмой версией. В записи демо-занятия вы найдете больше подробностей о схеме работы JIT и нововведениях. Демо-занятие проходит в рамках онлайн-курса «Backend-разработчик на PHP», где студенты осваивают экосистему PHP, учатся писать чистый код и решать реальные задачи, которые встают перед разработчиком middle-уровня.