Список изменений
Следующие изменения были произведены с функциями встроенных модулей.
| Version | Function | Description |
|---|
User Contributed Notes
There are no user contributed notes for this page.
- Appendices
- История PHP и смежных проектов
- Миграция с PHP 8.2.x на PHP 8.3.x
- Миграция с PHP 8.1.x на PHP 8.2.x
- Миграция с PHP 8.0.x на PHP 8.1.x
- Миграция с PHP 7.4.x на PHP 8.0.x
- Миграция с PHP 7.3.x на PHP 7.4.x
- Миграция с PHP 7.2.x на PHP 7.3.x
- Миграция с PHP 7.1.x на PHP 7.2.x
- Миграция с PHP 7.0.x на PHP 7.1.x
- Миграция с PHP 5.6.x на PHP 7.0.x
- Миграция с PHP 5.5.x на PHP 5.6.x
- Отладка в PHP
- Опции конфигурации
- Директивы php.ini
- Список/классификация модулей
- Список псевдонимов функций
- Список зарезервированных слов
- Список типов ресурсов
- Список доступных фильтров
- Список поддерживаемых транспортных протоколов
- Таблица сравнения типов в PHP
- Список меток (tokens) парсера
- Руководство по именованию
- Об этом руководстве
- Creative Commons Attribution 3.0
- Алфавитный список
- Список изменений
- Copyright © 2001-2023 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Вышел PHP 8.2: разбираем главные изменения
Вместе с PHP-разработчиками Александром Макаровым (@SamDark), Валентином Удальцовым (@vudaltsov) и наставником Хекслета по PHP Владленом Гилязетдиновым (@funkylen) разбираемся, какие новые фичи появились в PHP 8.2, насколько эти изменения глобальны и какую роль в них сыграл проект РHP Foundation.
Эта статья — саммари стрима YouTube-канала PHP Point.
Кстати, ежегодный опрос русскоязычного PHP-сообщества с итогами года запущен! Результатами поделимся в конце января.
Главные изменения в PHP 8.2

Readonly-классы
Поля readonly сделали еще до версии 8.2. Раньше писать в них код и читать его можно было только в конструкторе. А теперь для этого не нужно помечать каждое поле — достаточно отметить весь класс как readonly .
Как выглядел код в предыдущих версиях PHP:
class BlogData < public readonly string $title; public readonly Status $status; public function __construct(string $title, Status $status) < $this->title = $title; $this->status = $status; > >Как выглядит код в PHP 8.2:
readonly class BlogData < public string $title; public Status $status; public function __construct(string $title, Status $status) < $this->title = $title; $this->status = $status; > >Но у фичи есть особенности:
- Readonly -классы недоступны для классов с необъявленными типами.
- Также readonly -классы недоступны для классов со статическими свойствами.
- Если мы захотим наследоваться от старого readonly -класса, новый тоже должен быть Readonly.
Типы в виде дизъюнктивной нормальной формы (ДНФ)
Теперь вместо того, чтобы указывать тип mixed для аргументов в методах, можно просто перечислять необходимые типы через амперсанд.
Как выглядел код в предыдущих версиях PHP:
class Foo < public function bar(mixed $entity) < if ((($entity instanceof A) && ($entity instanceof B)) || ($entity === null)) < return $entity; >throw new Exception('Invalid entity'); > >Как выглядит код в PHP 8.2:
class Foo < public function bar((A&B)|null $entity) < return $entity; >>Пожелание от меня: будьте осторожны с этой фичей. Она позволяет много методов объединять в один. Если бы я программировал приложения, то так не делал бы. А вот во фреймворках она будет очень кстати, потому что иногда, ради красивой API, мы сознательно жертвуем такой вот правильностью — используем подход с mixed -типами в сигнатуре.
Самостоятельные типы null, false и true
Это изменение единогласно приняла вся команда разработчиков PHP, так как в ядре PHP есть методы, классы и функции, которые возвращают false или true .
Если у вас метод никогда не возвращает false , то теперь можно указать, что он возвращает true или значение. Или наоборот, null и значение, или false и значение. Фича удобная и делает язык немного строже.
Как выглядел код в предыдущих версиях PHP:
class Falsy < public function almostFalse(): bool < /* . */ *>public function almostTrue(): bool < /* . */ *>public function almostNull(): string|null < /* . */ *>>Как выглядит код в PHP 8.2:
class Falsy < public function alwaysFalse(): false < /* . */ *>public function alwaysTrue(): true < /* . */ *>public function alwaysNull(): null < /* . */ *>>Модуль «Random»
Random — это целый пак разных интерфейсов. Особенности фичи:
- Разработчики сделали объектно-ориентированный API.
- Каждый инстанс независимый — то есть для разных целей можно инстанцировать n-штук псевдослучайных генераторов, которые никогда не пересекутся. Стало более безопасно.
- Mersenne twister заменен на интерфейс Engine. Раньше mt_rand() надо было инициализировать. Он был нужен не для всяких крипто-фич, а для того чтобы, например, сортировать массивы в случайном порядке. mt_rand() работал достаточно быстро, поэтому использовать его для утилитарных задач было неплохо. Теперь его заменили на интерфейс Engine, который предоставляет готовые реализации.
Как выглядит код в PHP 8.2:
use Random\Engine\Xoshiro256StarStar; use Random\Randomizer; $blueprintRng = new Xoshiro256StarStar( hash('sha256', "Example seed that is converted to a 256 Bit string via SHA-256", true) ); $fibers = []; for ($i = 0; $i < 8; $i++) < $fiberRng = clone $blueprintRng; // Xoshiro256**'s 'jump()' method moves the blueprint ahead 2**128 steps, as if calling // 'generate()' 2**128 times, giving the Fiber 2**128 unique values without needing to reseed. $blueprintRng->jump();Константы в трейтах
Теперь можно объявлять константы внутри трейтов. Особенность фичи — нельзя получить доступ к константе через имя трейта, но можно через класс, который использует этот трейт.
Очень логичное изменение, на мой взгляд. Трейт сам по себе — это копипаст. Копипаст — штука опасная, но иногда полезная (у нас есть принцип «don’t repeat yourself»). И трейт — это один самых неинвазивных способов что-то повторить, который легко потом отрефакторить.
Как выглядит код в PHP 8.2:
trait Foo < public const CONSTANT = 1; >class Bar < use Foo; >var_dump(Bar::CONSTANT); // 1 var_dump(Foo::CONSTANT); // ErrorДинамические свойства объявлены устаревшими
В классах PHP можно было динамически присваивать значения свойствам, которые мы не объявили ранее, и эти свойства появлялись после классов.
Теперь так сделать нельзя — будет появляться Deprecation notice . Но если сильно нужно, динамическими свойствами можно пользоваться, если пометить класс аннотацией #[\AllowDynamicProperties] . В экземплярах stdClass динамические свойства по-прежнему можно использовать.
Как выглядел код в предыдущих версиях PHP:
class User < public $name; >$user = new User(); $user->last_name = 'Doe'; $user = new stdClass(); $user->last_name = 'Doe';Как выглядит код в PHP 8.2:
class User < public $name; >$user = new User(); $user->last_name = 'Doe'; // Deprecated notice $user = new stdClass(); $user->last_name = 'Doe'; // Still allowed#[\SensitiveParameter]
Это маленькая, но очень классная фича, которая мельком упоминается в официальном анонсе.
Параметры в методах теперь можно обозначить как #[\SensitiveParameter] . Ниже в коде так отмечен параметр $secret , и в логах вместо значения параметра secret написано (Object(SensitiveParameterValue) .
function sensitiveParametersWithAttribute( #[\SensitiveParameter] string $secret, string $normal )
Exception: Error! in example.php:15 Stack trace: #0 example.php(25): sensitiveParametersWithAttribute(Object(SensitiveParameterValue), 'normal') #1
Считаю это изменение очень крутым, так как теперь у нас не будут утекать всякие ключи от API, пароли от базы. Команда разработчиков PHP практически единогласно проголосовала за эту фичу.
Какие еще изменения произошли
Расширение enum в константах
Раньше, чтобы использовать enum , надо было дублировать их значение. Это было очень неприятно: enum есть, а в объявлениях констант нельзя было из них что-то использовать. Теперь можно: новая фича уравнивает весь синтаксис. Классно, что язык эволюционирует в сторону удобства и большей консистентности.
const C = [self::B->value => self::B];iterator_() + iterables
Теперь можно передавать в методы iterator_() тип \Traversables . Это просто замечательно, потому что раньше приходилось проверять, является ли аргумент объектом типа \Traversable , и если да, то надо было его конвертить. В PHP 8.2 можно больше не проводить эти проверки, что уменьшает количество кода и делает его более приятным и читаемым.
Расширена рефлексия
- Можно узнать, анонимный ли метод — ReflectionFunction::isAnonymous()
- Можно узнать, есть ли у метода прототип — ReflectionMethod::hasPrototype()
Новые функции memory_reset_peak_usage
Функции сбрасывают статистику по пиковому использованию памяти. Это очень полезно для EventLoop на PHP, Roadrunner и Swoole — мы сможем скинуть потребляемую память после запроса и измерить ту, которая ушла конкретно на один запрос.
Что признали устаревшим или убрали
- Интерполяция в строках вида $<>
- Не рекомендуется использовать функции utf8_encode и utf8_decode
- Функции strtolower и strtoupper теперь не учитывают локаль — это круто, потому что версии PHP, установленные в двух системах Linux, могут работать по-разному из-за выбранной дефолтной локали.
- Убрали много форматов callable :
- “self::method”
- “parent::method”
- “static::method”
- [“self”, “method”]
- [“parent”, “method”]
- [“static”, “method”]
- [“Foo”, “Bar::Method”]
- [new Foo, “Bar::Method”]
Мое мнение — на PHP 8.2 определенно стоит переходить хотя бы из-за крутых улучшений синтаксиса. Он все еще делает код более читаемым и понятным. Также разработчики пофиксили разные мелкие баги, которые мы не упомянули, но их было много.
Какие изменения PHP 8.2 еще в разработке

Некоторые разработчики считают, что в новую версию PHP добавили очень мало изменений. На самом деле, в РHP 8.2 было много саппортных вещей: код вычищали, из него что-то убирали. Каждое изменение, которое вводили разработчики, непросто описать в фичах. Да и вряд ли всем будет интересно, какие куски кода рефакторили. Так что по объему работы релиз 8.2 не отличается от предыдущих релизов. Просто в нем чуть меньше фич.
Большие усилия к разработке версии 8.2 приложили ребята из PHP Foundation — проекта, который финансирует разработчиков, готовых контрибьютить в PHP.

PHP Foundation создали много известных компаний, среди которых JetBrains, Automattic, Laravel. Проект запустили 22 ноября 2021 года, и за год коллектив из десяти администраторов-добровольцев и шести разработчиков внесли почти половину коммитов в ядро языка PHP и расширения.
В новую версию языка PHP Foundation имплементировал readonly -классы, самостоятельные типы null , false и true , тип true , типы в виде дизъюнктивной нормальной формы и получение свойств перечислений в константных выражениях. Также он объявил интерполяцию в строках вида $<> устаревшей.
Документация по PHP 8.2 еще в разработке, и разработчик PHP Foundation Джордж П. Баньярд сейчас отслеживает прогресс в изменениях. Вместе с командой он обсуждает эти нововведения:
- Автоматическая имплементация для enum Stringable
- Ассиметричная видимость
- Получение констант из класса
- Более понятные ошибки Date/Time
- Доработки по Readonly
- Работа с инициализаторами произвольных статических переменных.
Помочь составить документацию может каждый из нас — это, как говорится, good first issue (несложные задачи, выполнить которые под силу новичкам).
Также PHP Foundation планирует выдвинуть на обсуждение новые изменения в будущем релизе PHP 8.3.
Актуален ли PHP в 2021 году?
Фокус внимания давно переместился с PHP на JavaScript и Python. Тем не менее у него выходят новые версии, а тесты производительности говорят о неплохом прогрессе. Насколько актуален PHP сегодня? Под катом — размышления разработчика, который продолжает отдавать ему предпочтение.

Краткая история PHP
PHP разработал Расмус Лердорф в 1994 году. Лердорф создал набор скриптов, которые отслеживали посещения его онлайн-резюме, и назвал их Personal Home Page Tools («инструменты личной домашней страницы»). Со временем название превратилось в PHP Tools. Он пополнял этот набор новыми инструментами, а потом решил переписать их: добавил взаимодействие с базами данных и многое другое. Так набор превратился во фреймворк.
Дальше эти инструменты продолжали эволюционировать в еще более сложные примитивы, а после публикации кода в open source в 1995 году число пользователей стало расти заметно быстрее. Если вас интересуют подробности этой истории, вы можете найти их на официальном сайте PHP.
Последняя версия языка сейчас — PHP 8.0.
А что не так с PHP?
Уже долгие годы этот язык — мишень для критики. Люди справедливо упрекают его за проблемы в работе, особенно старые версии. Лердорф разрабатывал PHP как язык шаблонизации, а не как полнофункциональный язык программирования. Поэтому у него есть ряд недостатков, которые сильно усложняют поддержку и разработку крупных приложений.
Слабая типизация
Лично мне в этом языке не нравится слабая типизация, позволяющая сочетать разные типы и выполнять их неявные преобразования. Рассмотрим такой пример:
echo "1" + 3; echo 1 + "3"; echo "1" + "3";Результатом этих операций будет число 4, то есть в контексте оператора сложения язык преобразует числа в строке в целочисленные значения. В некоторых случаях это может оказаться желательным или позволит сэкономить пару строк кода, но чем больше становится проект, тем сложнее будет поддержка.
В поздних версиях языка начали появляться предупреждения о подобных странных и недопустимых операциях, то есть они признаны устаревшими или скоро ими станут.
Отсутствие пространств имен
Поддержка пространств имен была добавлена в PHP в версии 5.3. В более старых проектах приходилось создавать собственные типы пространств имен, в основном при помощи добавления пространств имен к названиям классов и методов. Из-за этого приходилось использовать повсюду абсурдно длинные имена.
В проектах, разработанных в предыдущих версиях, часто можно встретить классы наподобие Payments_Provider_Processor_Provider_SomeExternalServiceProvider , хотя его можно было бы просто назвать SomeExternalServiceProvider . В большинстве случаев это приводит к созданию раздутого кода и усложняет его чтение и разбор.
В более поздних версиях языка таких проблем нет.
Противоречивые функции стандартной библиотеки
Не буду говорить, что стандартная библиотека языка плоха, но она могла бы быть и получше. Язык довольно сильно совершенствуется, однако первым версиям стандартной библиотеки, на которые до сих пор ссылаются и поддерживают для обратной совместимости, не хватает целостности. Хоть это и небольшая проблема, она означает, что многие функции стандартной библиотеки имеют разные правила наименования, имена и порядок аргументов. Все это усложняет выявление их значений по умолчанию и поведение.
Вот некоторые примеры противоречивости наименований в строковых методах из документации:
- strpos(string $haystack, string $needle, int $offset = 0): int|false : находит позицию первого вхождения подстроки в строке;
- strsplit(string $string, int $length = 1): array : преобразует строку в массив;
- explode(string $separator, string $string, int $limit = PHP_INT_MAX): array : разделяет строку по граничной строке.
Три разные функции: одна с префиксом str , вторая с префиксом str_ , а третья без префикса. Аргумент $string является первым для str_split , но вторым для explode . Вы можете изучить все строковые методы в документации — этому паттерну следует множество функций, то есть среди них нет особого единообразия.
Суперглобальные переменные
Это больше относится к личным предпочтениям — я ненавижу использовать глобальные переменные, а следовательно, и суперглобальные. Когда находишь какие-то старые самодельные проекты, особенно высока вероятность встретиться с печально известными переменными типа $SERVER или $REQUEST . Не поймите меня неправильно: иногда они очень полезны и время от времени их нужно использовать. Однако для безопасного использования этих значений первым делом нужно инкапсулировать их в многократно используемые классы. Если этого не сделать, то взаимодействие со значениями или внесение изменений в крупный проект будет очень сложной задачей, ведь с этими значениями связано множество скрытых зависимостей.
И что хорошего в PHP?
Язык на многих произвел плохое впечатление, но за последние годы он сильно улучшился. Благодаря релизу PHP 7 язык модернизировался, в его основе появилось множество приятных особенностей, повысились скорость работы и удобство пользования.
Type hints
Это один из моих любимых способов модернизации старого кода на PHP: использование необязательных type hints, выполняющих преобразование типов, а также обеспечивающих документацию кода. Рассмотрим простую функцию:
function isValueSomething($value) <>Если добавить type hints, код станет таким:
function isValueSomething(string $value): bool <>Просто увидев сигнатуру функции, мы понимаем, что она ожидает строковое значение и вернет булев-результат. Можно добавить, что здесь полезно было бы применить правильное наименование, однако эти type hints гарантируют, что значения будут именно указанных типов и предоставляют IDE возможность автодополнения и статического анализа с предупреждениями и другими полезными вещами.
С версии 7.4 PHP позволяет задавать и типизированные свойства для классов:
class Person
Это означает, что у объектов Person будут строковые имя и фамилия, возраст в integer и допускающая пустое значение строка для должности. Чем больше классов — тем полезнее эта возможность.
Улучшения синтаксиса
В поздних версиях PHP появилось много синтаксических улучшений:
- стрелочные функции: fn ($x, $y) => $x + $y;
- оператор объединения с неопределенным значением: $value = $array[‘key’] ?? ‘default value’;
- присваивание с неопределенным значением: return $cache[‘key’] ??= computeSomeValue(‘key’);
- расширение массивов: $first = [‘a’, ‘b’]; $second = [‘c’, ‘d’]; $final= […$first, …$second];
- именованные аргументы: array_fill(start_index: 0, num: 100, value: 50);
- разделитель числовых литералов: 299_792_458
Помимо синтаксических он содержит возможности для комплексных улучшений.
Constructor promotion
Взгляните на класс Person :
class Person < private string $firstName; private string $lastName; protected int $age; public ?string $job; public function __construct( string $firstName, string $lastName, int $age, ?string $job )< $this->firstName = $firstName; $this->lastName = $lastName; $this->age = $age; $this->job = $job; > >Вместо этого избыточно многословного кода PHP 8 поддерживает возможность написания такого кода:
class Person < public function __construct( private string $firstName, private string $lastName, protected int $age, public ?string $job )<>>Удобно, не так ли?
Nullsafe-оператор
Этот оператор существовал в некоторых других языках наподобие JavaScript, но PHP его не поддерживал. Взгляните на код, который я взял из документации PHP:
else < $user = $repository->getUser(5); if (is_null($user)) < $result = null; >else < $result = $user->name; > >Именно так писали логику в старых версиях PHP для учета проверок на null. Новый nullsafe-оператор позволяет свести это к такому коду:
Разве не великолепно?
Объединенные типы
Хоть для меня это и не самая любимая штука, она все равно ценна в случаях, когда уже есть несколько возможных типов без type hints. Объединения позволяют определять в качестве вариантов несколько типов значений. Благодаря объединениям становится работающим вот такой код:
function doSomething(int|string $value): bool|array <>Обычно наличие нескольких возвращаемых типов сигнализирует о возможности улучшения кода, однако предыдущие версии PHP вообще не позволяли задавать в таких случаях типы, поэтому это все равно усовершенствование.
Производительность
У меня нет четких данных для сопоставления производительности с другими языками, но по сравнению с предыдущими версиями скорость работы кода PHP заметно выросла. В дополнение к рывку, сделанному PHP 7 по сравнению с PHP 5.6, все последующие релизы вносили улучшения, и эта тенденция продолжается. Проведенные Phoronix бенчмарки демонстрируют, что последняя версия PHP 8 в три с лишним раза быстрее PHP 5.6. В посте по ссылке выше есть подробные тесты, так что их стоит изучить.
В дополнение к этим бенчмаркам Kinsta также провела реальные испытания с WordPress. Вот результат для WordPress 5.3.

Точные цифры замеров таковы:
- Результаты бенчмарка WordPress 5.3 с PHP 5.6: 97,71 запросов/с
- Результаты бенчмарка WordPress 5.3 с PHP 7.0: 256,81 запросов/с
- Результаты бенчмарка WordPress 5.3 с PHP 7.1: 256,99 запросов/с
- Результаты бенчмарка WordPress 5.3 с PHP 7.2: 273,07 запросов/с
- Результаты бенчмарка WordPress 5.3 с PHP 7.3: 305,59 запросов/с
- Результаты бенчмарка WordPress 5.3 с PHP 7.4: 313,42 запросов/с
Пока в эти бенчмарки не включен PHP 8, однако видно, что даже версия 7.4 способна обрабатывать в три раза больше запросов по сравнению с 5.6, и это серьезное улучшение.
Вывод
В целом PHP за последние годы значительно улучшили, и с ним стало удобно работать. Я профессионально пишу на Golang, PHP и Python, но больше всего опыта у меня в PHP, поэтому я могу быть пристрастен. Однако, по моему мнению, PHP нашел идеальный баланс между гибкостью и поддерживаемостью.
В нем есть необходимые инструменты для реализации безумных вещей, гибкая система типов, позволяющая постепенно улучшать легаси-код, он достаточно быстр для большинства применений, его продолжают совершенствовать, а еще у него потрясающее сообщество open source.
Тем, кто разочаровался в PHP при работе с более старыми версиями, я рекомендую дать этому языку еще один шанс. Возможно, он вам все равно не понравится, но я считаю, что многие изменят свое мнение, беспристрастно взглянув на новую версию.
- Блог компании Leader-ID
- WordPress
- Веб-разработка
- PHP
Версии 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. Каких возможностей лишены те, кто всё ещё не обновился?
Версия 7.0 основывалась на новой технологии phpng — PHP Next Generation, «Следующее поколение PHP». Она создавалась с целью увеличить производительность языка без снижения совместимости. В реальной практике PHP 7 оказался примерно в 2 раза быстрее PHP 5, а разница в производительности на синтетическом тесте bench.php составила вовсе 14 раз.
С заботой о пользователях мобильных гаджетов разработчики также поработали над исполнением движка и уменьшили потребление памяти при работе 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;
- самый широких выбор ПО и плагинов, совместимых с сайтом.
О работе с PHP на VPS мы пока говорить не будем, так как для этого нужен отдельный материал. Поэтому дальше мы дадим рекомендации пользователям виртуального и специализированного хостинга.
Узнайте, какая версия PHP используется на вашем сайте. Эта информация доступна в настройках веб-сервера: например, на хостинге «Джино» они расположены здесь). Владельцы сайтов на WordPress могут увидеть текущую версию PHP в панели администратора, в разделе Инструменты / Здоровье сайта / Информация. Также вы можете написать этот скрипт, разместить его в файлах сайта и обратиться к нему из браузера:
В результате будет показана информация о версии.
Если ваша текущая версия PHP не входит в число поддерживаемых, взвесьте все «за» и «против» перед обновлением. Ведь чем старее скрипты вашего сайта, тем сложнее может быть перейти на поддерживаемую версию PHP. Тем, кто готов обновиться, нужно сделать следующее:
- Убедитесь, что у вас сохранена свежая резервная копия файлов сайта.
- Проверьте совместимость используемого ПО, фреймворков, библиотек, плагинов с выбранной вами версией PHP. Если что-то из этого не совместимо с ней, убирайте и заменяйте на более современные аналоги.
- Измените версию PHP на хостинге, через настройки сервера в контрольной панели или через запрос в техподдержку.
- После обновления протестируйте все функции сайта, при тестировании проверяйте лог на предмет «Fatal error» и других ошибок, которых раньше не было. Если все функции работают, а на страницах сайта появляются предупреждения PHP — отключите отображение ошибок.
- Если после обновления возникли серьёзные нарушения в работе сайта, верните старую версию PHP. Разберитесь в проблемах сами или обратитесь за помощью к специалистам.
Чтобы переход на новую версию PHP никогда не составлял большого труда, постоянно адаптируйте свой сайт под последнюю поддерживаемую версию языка. А также используйте регулярно обновляемые плагины и ПО, избавляясь от всего, что не обновлялось больше года и не подлежит использованию с актуальными версиями PHP.
