Миграция с PHP 7.4.x на PHP 8.0.x
Новая версия содержит ряд новых функций и несовместимостей, наличие которых следует проверить перед переключением версий PHP в производственной среде.
Смотрите также руководство по миграции для версий PHP 7.0.x, 7.1.x, 7.2.x, 7.3.x и 7.4.x.
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, сравнение с PHP 7
07.01.2020 вышла новая стабильная версия PHP 8 (8.0.1). В этой статье мы расскажем о новых функциях и возможностях в сравнении с версией PHP 7.
PHP 8 стал еще более быстрым и надежным. По сравнению с версией PHP 7 появилось множество новых и полезных вещей, которые обязательно будут востребованы пользователями. Рассмотрим подробнее эти нововведения.
Типы Union 2.0 (Объединенные типы)
Существует множество случаев, когда использование типов объединения может быть полезным. Вместо аннотаций PHPDoc для объединенных типов теперь вы можете использовать объявления union type, которые проверяются сразу во время выполнения.
Union Types — это совокупность двух или более типов, которые указывают, что вы можете использовать любой из них.
JIT – компилятор
JIT (Just In Time — «в нужный момент») — это динамическая компиляция байт кода в машинный. JIT компилятор значительно улучшает производительность работы программ. Проверка на синтетических бенчмарках показывает улучшение производительности примерно в 3 раза и в 1,5–2 раза для некоторых долго работающих приложений.
В JIT код переводится сначала в промежуточное представление и только потом в машинный код. То есть, выполняется непосредственно на процессоре, а не на виртуальной машине Zend VM.
JIT реализован как независимая часть OPcache. Его можно включать / отключать во время компиляции или выполнения скрипта.
Использование ::class для объектов
В PHP 8 теперь вы можете использовать ::class для объектов вместо того, чтобы использовать get_class() как раньше. Работает точно так же, как и get_class().
Атрибуты
В PHP 8 теперь вместо аннотаций PHPDoc вы можете использовать структурные метаданные с нативным синтаксисом PHP.
Выражение Match
В PHP 8 новое выражение match похоже на оператор switch, но имеет свои особенности:
- Match — это выражение и его результат может быть сохранён в переменной или возвращён.
- Условия match поддерживают только однострочные выражения, для которых не требуется управляющая конструкция break;
- Выражение match использует строгое сравнение.
Оператор Nullsafe
В PHP 8 теперь вместо проверки на null вы можете использовать последовательность вызовов с новым оператором Nullsafe. Если один из элементов в последовательности возвращает null, то выполнение прерывается и вся последовательность возвращает null.
Улучшенное сравнение строк и чисел
Теперь при сравнении с числовой строкой PHP 8 использует сравнение чисел. В противном случае число преобразуется в строку и используется сравнение строк.
Ошибки согласованности типов для встроенных функций
В PHP 8 большинство внутренних функций теперь выбрасывают исключение Error, если при проверке параметра возникает ошибка.
Именованные аргументы
В PHP 8 теперь можно:
- Указывать только необходимые параметры и пропускать необязательные.
- Порядок аргументов не важен, аргументы самодокументируемы.
Объявление свойств в конструкторе
В новой версии PHP 8 теперь используется гораздо меньше шаблонного кода для определения и инициализации свойств.
Новый тип возврата static
Ранее в PHP уже были возвращаемые типы — self и parent, но static не был допустимым типом возврата для этого языка программирования. Теперь есть.
Throw-выражения
В PHP оператор throw не может создавать исключения там, где были разрешены только выражения, например стрелочные функции, оператор объединения и тернарный оператор.
В новом PHP 8 теперь вы можете преобразовывать инструкцию throw в выражение.
Weak maps
Weak maps — это набор объектов, на которые в коде слабо ссылаются ключи, что может привести к их удалению сборщиками мусора. В PHP 8 добавлен класс WeakMaps для создания сохранения ссылки на объект. При этом она не препятствует удалению самого объекта.
Завершающая запятая в списках параметров
Ранее при вызове функции в списках параметров отсутствовала поддержка запятой. В PHP 8 теперь это разрешено.
Новый Stringable интерфейс
В PHP 8 теперь вы можете использовать интерфейс Stringable для аннотации типов или имплементации метода __toString (). И больше нет необходимости реализовывать его вручную.
Новые функции в PHP 8
- get_debug_type() — возвращает тип переменной. В отличии от gettype() возвращает более полезный вывод для массивов, строк, анонимных классов и объектов.
- str_starts_with() — проверяет, начинается ли строка с определенной строки. Возвращает TRUE / FALSE.
- str_ends_with() — проверяет, заканчивается ли строка с определенной строки. Возвращает TRUE / FALSE.
- str_contains() — проверяет, содержит ли строка другую строку.
- fdiv() — эта функция похожа на fmod() и intdiv(), что позволяет делить на 0. Но вместо ошибок получаем INF, -INF или NAN, в зависимости от случая.
6. get_resource_id() — ранее ресурсам присваивается идентификатор, но для этого необходимо было преобразование ресурса в int. В PHP 8 добавлена функция get_resource_id(), что делает эту операцию более очевидной и безопасной для типов.
К сожалению многие CMS пока не поддерживают PHP 8, в частности и 1С-Битрикс. В любом случае поддержка PHP 8 скоро появится на всех тарифах нашего хостинга.
Подробнее ознакомиться с нововведениями можно на официальной странице проекта.
PHP 8: код «До» и «После» (сравнение с PHP 7.4)

Осталось всего несколько месяцев до выхода PHP 8, и в этой версии действительно есть много хорошего. Под катом расскажем, как эти нововведения уже начали менять подход автора этого материала к написанию кода.
Подписчики событий с атрибутами
Я постараюсь не злоупотреблять атрибутами, но в случае с настройкой слушателей событий, например, они очень даже кстати.
В последнее время я работал над системами, где такой настройки было очень много. Возьмём пример:
class CartsProjector implements Projector < use ProjectsEvents; protected array $handlesEvents = [ CartStartedEvent::class =>'onCartStarted', CartItemAddedEvent::class => 'onCartItemAdded', CartItemRemovedEvent::class => 'onCartItemRemoved', CartExpiredEvent::class => 'onCartExpired', CartCheckedOutEvent::class => 'onCartCheckedOut', CouponAddedToCartItemEvent::class => 'onCouponAddedToCartItem', ]; public function onCartStarted(CartStartedEvent $event): void < /* … */ >public function onCartItemAdded(CartItemAddedEvent $event): void < /* … */ >public function onCartItemRemoved(CartItemRemovedEvent $event): void < /* … */ >public function onCartCheckedOut(CartCheckedOutEvent $event): void < /* … */ >public function onCartExpired(CartExpiredEvent $event): void < /* … */ >public function onCouponAddedToCartItem(CouponAddedToCartItemEvent $event): void < /* … */ >>У атрибутов в PHP 8 есть два преимущества:
- Код для настройки слушателей событий и обработчиков собран в одном месте, и мне не нужно прокручивать файл до начала, чтобы узнать, правильно ли настроен слушатель.
- Мне больше не нужно беспокоиться о написании и управлении именами методов в виде строк (когда IDE не может их автозаполнить, нет статического анализа опечаток и не работает переименование методов).
class CartsProjector implements Projector < use ProjectsEvents; @@SubscribesTo(CartStartedEvent::class) public function onCartStarted(CartStartedEvent $event): void < /* … */ >@@SubscribesTo(CartItemAddedEvent::class) public function onCartItemAdded(CartItemAddedEvent $event): void < /* … */ >@@SubscribesTo(CartItemRemovedEvent::class) public function onCartItemRemoved(CartItemRemovedEvent $event): void < /* … */ >@@SubscribesTo(CartCheckedOutEvent::class) public function onCartCheckedOut(CartCheckedOutEvent $event): void < /* … */ >@@SubscribesTo(CartExpiredEvent::class) public function onCartExpired(CartExpiredEvent $event): void < /* … */ >@@SubscribesTo(CouponAddedToCartItemEvent::class) public function onCouponAddedToCartItem(CouponAddedToCartItemEvent $event): void < /* … */ >>Static вместо doc-блоков
Это не такое важное изменение, но я сталкиваюсь с этим каждый день. Я часто обнаруживаю, что мне всё ещё нужны doc-блоки, когда нужно указать, что функция имеет возвращаемый тип static.
Если в PHP 7.4 мне нужно было писать:
/** * @return static */ public static function new()
То теперь достаточно:
public static function new(): static
DTO, передача свойств и именованных аргументов
Я довольно много писал об использовании системы типов PHP и паттерна DTO (data transfer objects). Естественно, я часто использую DTO в своём собственном коде, поэтому можете представить, насколько я счастлив, что теперь имею возможность переписать это:
class CustomerData extends DataTransferObject < public string $name; public string $email; public int $age; public static function fromRequest( CustomerRequest $request ): self < return new self([ 'name' =>$request->get('name'), 'email' => $request->get('email'), 'age' => $request->get('age'), ]); > > $data = CustomerData::fromRequest($customerRequest);Вот, так-то лучше:
class CustomerData < public function __construct( public string $name, public string $email, public int $age, ) <>> $data = new CustomerData(. $customerRequest->validated());Обратите внимание на использование передачи свойств конструктора как именованных параметров. Да, их можно передавать с помощью именованных массивов и оператора Spread.
Перечисления и match
Вы используете перечисление с некоторыми методами, которые возвращают результат в зависимости от конкретного значения из перечисления?
/** * @method static self PENDING() * @method static self PAID() */ class InvoiceState extends Enum < private const PENDING = 'pending'; private const PAID = 'paid'; public function getColour(): string < return [ self::PENDING =>'orange', self::PAID => 'green', ][$this->value] ?? 'gray'; > >Я бы сказал, что для более сложных условий вам лучше использовать паттерн Состояние, но есть случаи, когда достаточно перечисления. Этот странный синтаксис массива уже является сокращением для более громоздкого условного выражения:
/** * @method static self PENDING() * @method static self PAID() */ class InvoiceState extends Enum < private const PENDING = 'pending'; private const PAID = 'paid'; public function getColour(): string < if ($this->value === self::PENDING) < return 'orange'; >if ($this->value === self::PAID) < return 'green' >return 'gray'; > >PHP 7.4 — альтернативный вариант
Но в PHP 8 вместо этого мы можем использовать match.
/** * @method static self PENDING() * @method static self PAID() */ class InvoiceState extends Enum < private const PENDING = 'pending'; private const PAID = 'paid'; public function getColour(): string < return match ($this->value) < self::PENDING =>'orange', self::PAID => 'green', default => 'gray', >; >Объединения вместо doc-блоков
Это работает аналогично тому, что было описано ранее для возвращаемого типа static.
/** * @param string|int $input * * @return string */ public function sanitize($input): string;public function sanitize(string|int $input): string;Генерация исключений
Раньше вы не могли использовать throw в выражении, а это означало, что вам приходилось писать, например, вот такие проверки:
public function (array $input): void < if (! isset($input['bar'])) < throw BarIsMissing::new(); >$bar = $input['bar']; // … >В PHP 8 throw стало выражением, что означает, что вы можете использовать его вот так:
public function (array $input): void < $bar = $input['bar'] ?? throw BarIsMissing::new(); // … >Оператор nullsafe
Если вы знакомы с оператором null coalescing (коалесцирующий), вам известны его недостатки: он не работает с вызовами методов. Поэтому мне часто были нужны промежуточные проверки или подходящие для этой цели функции фреймворков:
$startDate = $booking->getStartDate(); $dateAsString = $startDate ? $startDate->asDateTimeString() : null;С появлением оператора nullsafe я могу решить эту задачу гораздо проще.
$dateAsString = $booking->getStartDate()?->asDateTimeString();А какие нововведения в PHP 8 считаете важными вы?
На правах рекламы
Серверы для разработки и размещения ваших проектов. Каждый сервер подключён к защищённому от DDoS-атак каналу в 500 Мегабит, есть возможность использовать высокоскоростную локальную сеть. Мы предлагаем большой выбор тарифных планов, смена тарифа в один клик. Очень удобная панель управления серверами и возможность использовать API. Поспешите проверить!

- Блог компании VDSina.ru
- PHP
- Программирование
В чем разница между php7 и php8?
PHP 7 и PHP 8 — это две разные версии языка PHP. PHP 7 был выпущен в 2015 году, и содержит множество улучшений по сравнению с предыдущими версиями, такие как увеличение производительности на достижение до двукратного увеличения, и улучшение синтаксиса и функциональности.
PHP 8 был выпущен в 2020 году, и включает в себя ряд новых функций и улучшений, таких как:
- Новый тип данных «Union Types», который позволяет объявлять переменные и аргументы функций, которые могут принимать несколько типов данных.
- Инструкция «match» для проверки значения на соответствие различным условиям.
- Улучшенная обработка ошибок с использованием свойств «attributes»
- И многое другое.
В целом, PHP 8 предоставляет более современный синтаксис и новые функции, которые могут упростить и ускорить разработку приложений. Однако, при обновлении на PHP 8, следует быть осторожным, поскольку некоторые коды, которые работали на PHP 7, могут не работать на PHP 8 без изменений.
Еще одним важным улучшением PHP 8 является система JIT (Just-In-Time) компиляции. JIT компиляция позволяет интерпретатору компилировать код на лету, что может существенно увеличить производительность приложений.
Кроме того, PHP 8 имеет ряд улучшений в работе с объектами, таких как автоматическое добавление метода __construct, и синтаксическое сокращение для создания объектов и вызова методов.
В целом, PHP 8 предоставляет множество улучшений и новых функций, которые могут упростить и ускорить разработку приложений, а также увеличить их производительность.
PHP 8 имеет также ряд улучшений в работе с массивами, такие как инструкция «match» для проверки значения на соответствие различным условиям, инструкция «coalesce assign» для присваивания значения только если переменная не имеет значения, и новый оператор «??=» для конкатенации массивов.
PHP 8 также включает в себя ряд улучшений в работе с функциями, такие как поддержка ссылок для возврата значений из функций, автоматическое удаление неиспользуемых параметров функций.
В общем, PHP 8 предлагает ряд улучшений и новых функций, которые могут упростить и ускорить разработку приложений, а также повысить их производительность.

В чем разница между php7 и php8?
PHP 7 и PHP 8 — это две разные версии языка PHP. PHP 7 был выпущен в 2015 году, и содержит множество улучшений по сравнению с предыдущими версиями, такие как увеличение производительности на достижение до двукратного увеличения, и улучшение синтаксиса и функциональности.
PHP 8 был выпущен в 2020 году, и включает в себя ряд новых функций и улучшений, таких как:
- Новый тип данных «Union Types», который позволяет объявлять переменные и аргументы функций, которые могут принимать несколько типов данных.
- Инструкция «match» для проверки значения на соответствие различным условиям.
- Улучшенная обработка ошибок с использованием свойств «attributes»
- И многое другое.
В целом, PHP 8 предоставляет более современный синтаксис и новые функции, которые могут упростить и ускорить разработку приложений. Однако, при обновлении на PHP 8, следует быть осторожным, поскольку некоторые коды, которые работали на PHP 7, могут не работать на PHP 8 без изменений.
Еще одним важным улучшением PHP 8 является система JIT (Just-In-Time) компиляции. JIT компиляция позволяет интерпретатору компилировать код на лету, что может существенно увеличить производительность приложений.
Кроме того, PHP 8 имеет ряд улучшений в работе с объектами, таких как автоматическое добавление метода __construct, и синтаксическое сокращение для создания объектов и вызова методов.
В целом, PHP 8 предоставляет множество улучшений и новых функций, которые могут упростить и ускорить разработку приложений, а также увеличить их производительность.
PHP 8 имеет также ряд улучшений в работе с массивами, такие как инструкция «match» для проверки значения на соответствие различным условиям, инструкция «coalesce assign» для присваивания значения только если переменная не имеет значения, и новый оператор «??=» для конкатенации массивов.
PHP 8 также включает в себя ряд улучшений в работе с функциями, такие как поддержка ссылок для возврата значений из функций, автоматическое удаление неиспользуемых параметров функций.
В общем, PHP 8 предлагает ряд улучшений и новых функций, которые могут упростить и ускорить разработку приложений, а также повысить их производительность.
