Php 8 что нового
class PostsController
#[ Route ( «/api/posts/» , methods : [ «GET» ])]
public function get ( $id ) < /* . */ >
>
Вместо аннотаций PHPDoc вы можете использовать структурные метаданные с нативным синтаксисом PHP.
Объявление свойств в конструкторе RFC Документация
class Point <
public float $x ;
public float $y ;
public float $z ;
public function __construct (
float $x = 0.0 ,
float $y = 0.0 ,
float $z = 0.0
) $this -> x = $x ;
$this -> y = $y ;
$this -> z = $z ;
>
>
class Point <
public function __construct (
public float $x = 0.0 ,
public float $y = 0.0 ,
public float $z = 0.0 ,
) <>
>
Меньше шаблонного кода для определения и инициализации свойств.
Тип Union RFC Документация
class Number <
/** @var int|float */
private $number ;
/**
* @param float|int $number
*/
public function __construct ( $number ) $this -> number = $number ;
>
>
new Number ( ‘NaN’ ); // Нет ошибки
class Number <
public function __construct (
private int | float $number
) <>
>
new Number ( ‘NaN’ ); // TypeError
Вместо аннотаций PHPDoc для объединённых типов вы можете использовать объявления типа union, которые проверяются во время выполнения.
Выражение Match RFC Документация
switch ( 8.0 ) <
case ‘8.0’ :
$result = «О нет!» ;
break;
case 8.0 :
$result = «То, что я и ожидал» ;
break;
>
echo $result ;
//> О нет!
echo match ( 8.0 ) <
‘8.0’ => «О нет!» ,
8.0 => «То, что я и ожидал» ,
>;
//> То, что я и ожидал
Новое выражение match похоже на оператор switch со следующими особенностями:
- Match — это выражение, его результат может быть сохранён в переменной или возвращён.
- Условия match поддерживают только однострочные выражения, для которых не требуется управляющая конструкция break;.
- Выражение match использует строгое сравнение.
Оператор Nullsafe RFC
if ( $session !== null ) $user = $session -> user ;
if ( $user !== null ) $address = $user -> getAddress ();
if ( $address !== null ) $country = $address -> country ;
>
>
>
$country = $session ?-> user ?-> getAddress ()?-> country ;
Вместо проверки на null вы можете использовать последовательность вызовов с новым оператором Nullsafe. Когда один из элементов в последовательности возвращает null, выполнение прерывается и вся последовательность возвращает null.
Улучшенное сравнение строк и чисел RFC
0 == ‘foobar’ // true
0 == ‘foobar’ // false
При сравнении с числовой строкой PHP 8 использует сравнение чисел. В противном случае число преобразуется в строку и используется сравнение строк.
Ошибки согласованности типов для встроенных функций RFC
strlen ([]); // Warning: strlen() expects parameter 1 to be string, array given
array_chunk ([], — 1 ); // Warning: array_chunk(): Size parameter expected to be greater than 0
strlen ([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk ([], — 1 ); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0
Большинство внутренних функций теперь выбрасывают исключение Error, если при проверке параметра возникает ошибка.
Компиляция Just-In-Time
PHP 8 представляет два механизма JIT-компиляции. Трассировка JIT, наиболее перспективная из них, на синтетических бенчмарках показывает улучшение производительности примерно в 3 раза и в 1,5–2 раза на некоторых долго работающих приложениях. Стандартная производительность приложения находится на одном уровне с PHP 7.4.
Относительный вклад JIT в производительность PHP 8
Улучшения в системе типов и обработке ошибок
- Более строгие проверки типов для арифметических/побитовых операторов RFC
- Проверка методов абстрактных трейтов RFC
- Правильные сигнатуры магических методов RFC
- Реклассификация предупреждений движка RFC
- Фатальная ошибка при несовместимости сигнатур методов RFC
- Оператор @ больше не подавляет фатальные ошибки.
- Наследование с private методами RFC
- Новый тип mixed RFC
- Возвращаемый тип static RFC
- Типы для стандартных функций E-mail Тема
- Непрозрачные объекты вместо ресурсов для Curl, Gd, Sockets, OpenSSL, XMLWriter, e XML расширения
Прочие улучшения синтаксиса
- Разрешена запятая в конце списка параметров RFC и в списке use замыканий RFC
- Блок catch без указания переменной RFC
- Изменения синтаксиса переменных RFC
- Имена в пространстве имен рассматриваются как единый токен RFC
- Выражение Throw RFC
- Добавление ::class для объектов RFC
Новые классы, интерфейсы и функции
- Класс Weak Map
- Интерфейс Stringable
- str_contains(), str_starts_with(), str_ends_with()
- fdiv()
- get_debug_type()
- get_resource_id()
- Объектно-ориентированная функция token_get_all()
- Новые API для обходения и обработки DOM
Выше производительность, лучше синтаксис, надежнее система типов.
Для загрузки исходного кода PHP 8 посетите страницу downloads. Бинарные файлы Windows находятся на сайте PHP для Windows. Список изменений представлен в ChangeLog.
Руководство по миграции доступно в разделе документации. Пожалуйста, изучите его для получения подробного списка новых возможностей и обратно несовместимых изменений.
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
- View Source
Обзор PHP 8: что изменилось, рекомендации по тонкой настройке

С выходом PHP 8 разработчики получили доступ ко множеству новых функций и улучшений, которые делают написание кода на PHP более быстрым, безопасным и эффективным. В этой статье мы рассмотрим некоторые из наиболее значительных изменений и новых возможностей, представленных в PHP 8, включая JIT-компилятор, поддержку типов union и именованные аргументы. Также мы приведем несколько рекомендаций по оптимизации и тонкой настройке.
PHP 8: Что нового?
Именованные аргументы (Named arguments)
Эта функция позволяет разработчикам передавать аргументы в функции, используя их имена, а не позиции. С их помощью разработчики могут пропускать необязательные аргументы, имеющие значения по умолчанию, и передавать только те, которые им нужны, причем в любом порядке. Это делает код более читабельным и снижает вероятность передачи неверного значения неверному параметру.

Поддержка атрибутов
Это нововведение позволяет добавлять структурированные метаданные к свойствам, методам, функциям и параметрам классов. Метаданные можно использовать для различных целей, например, для документирования кода или добавления информации для других инструментов. Один из примеров использования этой функции ― автоматическая генерация документации API. Другой пример ― автоматическая проверка параметров функций на основе их метаданных. Таким образом, атрибуты обеспечивают PHP-разработчикам большую гибкость и расширяемость кода.

Продвижение свойств конструктора (Constructor property promotion)
Эта функция упрощает процесс определения и инициализации свойств объекта. До этого разработчикам приходилось определять свойства объекта, а затем инициализировать их в методе конструктора, что отнимало время и могло приводить к ошибкам. Благодаря функции Constructor Property Promotion разработчики теперь могут определять и инициализировать свойства объектов непосредственно в методе конструктора, сокращая объем необходимого кода и улучшая его читабельность.

Поддержка типов union
В PHP 8 разработчики могут указывать, что аргумент функции или возвращаемое значение может быть одним из нескольких возможных типов, а не только одним конкретным типом. Например, функция, ожидающая в качестве аргумента целое число или число float, теперь может быть определена как принимающая тип union «int|float». Аналогично, функция, возвращающая строку или null, может быть определена как возвращающая тип union «string|null». Union-типы обеспечивают большую гибкость в определении функций и могут облегчить чтение и поддержку кода.

Поддержка выражений Match
Выражение Match позволяет сопоставить заданное значение с набором возможных случаев и соответствующих им действий. Синтаксис похож на оператор switch, но с большей гибкостью в плане шаблонов, которые могут быть сопоставлены. Выражения Match могут применять различные типы шаблонов, такие как литералы, переменные и другие, а также иметь несколько условий и действий в одном операторе. Таким образом, Match-выражения ― это полезный инструмент для оптимизации кода.

JIT-компилятор

JIT, или Just-In-Time компиляция ― это технология, значительно повышающая скорость выполнения кода в языках программирования. Механизм JIT в PHP 8 компилирует машинный код непосредственно перед его исполнением. Движок JIT также способен определять части кода, которые выполняются чаще всего, и компилировать их в машинный код, повышая общую производительность приложения. Особенно значительный прирост скорости получается в тех случаях, когда нужно выполнять много математических операций. Хотя JIT-компиляция не включена по умолчанию в PHP 8, ее можно легко включить, изменив настройки конфигурации.
Слабые карты (weak maps)

Слабые карты предоставляют возможность связывать объекты с метаданными, не мешая при этом сборщику мусора удалять объекты из памяти. Это полезно в сценариях, когда вам нужно связать некоторые данные с объектом, но при этом автоматически удалять объект, когда он больше не нужен. Данные также будут автоматически удалены вместе с объектом. Это поможет предотвратить утечки памяти и повысить производительность в долгоиграющих процессах. Например, слабая карта может быть использована для запоминания результата вычислений.
Как использовать преимущества PHP 8 для лучшей производительности?
Вот несколько советов, как вы можете оптимизировать производительность PHP 8:
Используйте кэширование OpCode
В PHP 8 появился новый кэш OpCode под названием «Zend OPCache», который может значительно ускорить работу вашего приложения. Обязательно включите его в файле php.ini и настройте параметры под ваше конкретное приложение.
Оптимизируйте запросы к базе данных
Запросы к базе данных часто являются узким местом в веб-приложениях. Убедитесь, что вы используете максимально эффективные запросы, с надлежащим индексированием и кэшированием, где это возможно. Кроме того, можно использовать конструктор запросов, который генерирует оптимизированные запросы.
Сократите количество вызовов функций
Вызовы функций могут снизить производительность вашего приложения, особенно если вы вызываете одну и ту же функцию несколько раз. Рассмотрите возможность кэширования результатов вызовов функций или, по возможности, объедините их в один вызов.
Используйте lazy loading
Загрузка ресурсов только тогда, когда они необходимы (lazy loading) может значительно повысить производительность вашего приложения. Например, вы можете использовать методы «ленивой» загрузки для таких объектов, как изображения, видео и большие наборы данных.
Минимизируйте файловый ввод-вывод
Чтение и запись файлов могут быть медленными, поэтому важно минимизировать файловый ввод-вывод, где это возможно. Рассмотрите возможность использования кэширования в памяти или базы данных для хранения часто используемых данных, а также избегайте чтения и записи файлов при каждом запросе, если это возможно.
В заключение


С выходом PHP 8 веб-разработчики получили доступ к целому ряду новых функций и улучшений, позволяющих оптимизировать безопасность, эффективность и скорость работы веб-приложений. Последняя версия включает в себя мощный JIT-компилятор, Constructor Property Promotion, а также другие значительные обновления. Создаете ли вы веб-приложение с нуля или обновляете уже существующее, новые функции PHP 8 открывают широкие возможности для повышения производительности вашего сайта, оптимизации процессов разработки и повышения удобства работы пользователей.
PHP 8 — что нового в 8-ой версии php
Оглавления для удобной навигации по новым PHP 8.0 фичам (клик для перехода):

1. Новые нативные функции для работы со строками
str_contains — для проверки есть ли подстрока в строке.
str_contains(string $haystack, string $needle): bool
str_starts_with, str_ends_with — функции для проверки «начинается ли строка с» и «заканчивается ли строка на»
str_starts_with(string $haystack, string $needle): bool
str_ends_with (string $haystack, string $needle): bool
2. Named arguments
Теперь можно использовать именованные аргументы. Это может быть полезно, например, когда функция имеет много необязательных аргументов, но нам они не важны и нам важно передать только последний из аргументов.
function namedArgExample(string $arg1, array $arg2 = [], array $arg3 = [], bool $arg4 = false); namedArgExample('string', arg4: true);
namedArgExample('string', [], [], true)
3. «Constructor property promotion» или просто «Constructor promotion»
Для меня, это одна из самых полезных фичей новой версии, которая позволяет экономить время разработки и рефакторинга.
Прямо в конструкторе можно указать модификтор доступа любого аргумента будь то private / protected / public , тогда property с таким именем можно нужно не объявлять вовсе. Как можно заметить, никакое присваивание в теле конструктора тоже не нужно, наличие модификатора доступа в конструкторе PHP 8.0 — автоматически создает проперти с именем, равным именем переменной и присваивает параметр в property.
class A < public function __construct( private B $b, private RouterInterface $router ) < >>
class A < private B $b; private RouterInterface $router; public function __construct( private B $b, private RouterInterface $router ) < $this->b = $b; $this->router = $router; > >
Используя DI, autowiring и constructor promotion — теперь сплошное удовольствие при подстановке зависимостей в сервис.
4. match expression
Match expression (см. https://www.php.net/manual/en/control-structures.match.php) — более емкий и читаемый вариант для оператора switch . Есть и отличие от switch : match всегда использует строгое сравнение. Отпадает необходимость в break.
$var = 2; echo match ($var) < 2 =>'two', 3 => 'three', default => 'none', >;
Итого про match:
не любой switch можно заменить на match . Вместо простых switch можно использовать более читаемый и емкий match .
5. Union types
class UnionTypeExample
В этом случае в проперти $this->city можно будет присовить только типы false, null или объект City.
То, что раньше описывали c помощью phpdoc /** @var false|null */ теперь можно легально описать языковой конструкцией.
Кроме types properties, Union types можно использовать как в аргументах, так и в возвращаемых значениях.
Лучше не увлекаться Union types в PHP, так как все таки это не однозначность в типах.
6. Attributes PHP 8.0 feature
Аттрибуты — фича, которая позволяет использовать языковую конструкцию для добавления мета-данных к классу, функции, проперти. Проблема, которую решают аттрибуты — зависимость кода от PHPDoc комментариев, что очень широко используется в doctrine, symfony и тд. Теперь выполнение кода может зависеть от аттрибутов:) которые являются языковой конструкцией, то есть это более «стандартизированный» подход.
Аттрибуты в PHP объявляются с помощью символов #[ и ]
/** * @Route(path="/", methods=, name="main") */ public function indexAction(): Response
#[Route('/', methods: ['GET'], name: 'main'] public function indexAction(): Response
По поводу синтаксиса аттрибутов было много споров. В PHP все что начинается с # является комментарием. Это значит, что синтаксис аттрибутов #[ не будет вызывать синтаксическую ошибку на более ранних версиях PHP (до PHP 8.0). То есть код с аттрибутами запустится и на более ранних версиях языка, чем когда аттрибуты стали поддерживаться (с PHP 8.0). Другой вопрос, станет ли код на ранних версиях работать ожидаемо:)
PHP 8.0: Nullsafe operator feature
Проверка на null при вызове методов может быть осуществлена прямо в вызове с помощью добавления знака ? (вопрос): ?->
Если один из объектов в цепочке вызов выше будет null , то в переменную запишется null
Может быть интересно:

Дата добавления: 3 года назад
php
Похожий контент:
- Как удалить лишние переводы строк? 0 ответов
- Ошибка DOMDocument::loadHTML() expects parameter 1 to be a valid path, string given Решено!
- Recaptcha не работает с https Решено!
- dns_get_record падает с ошибкой A temporary server error occurred. Решено!
- MySQL ошибки Lost connection to MySQL server at ‘waiting for initial communication packet’ 1 ответ
- Не устанавливается php 5.6 на debian 0 комментариев
- php 5.5 что нового — 10 новых возможностей 0 комментариев
- php 5.6 что нового — 10 новых возможностей 0 комментариев
- Перевод kohana с php 5 на php 71 комментарий
- DAO vs Active Record vs Data Mapper паттерны при работе с базой данных 0 комментариев
Php 8 что нового
Добавлена поддержка определения свойств в конструкторе (объявление свойств в сигнатуре конструктора).
Объединение типов
Выражение Match
Оператор Nullsafe
Другие новые функции
- Добавлен класс WeakMap.
- Добавлен класс ValueError .
- Любое количество параметров функции теперь может быть заменено вариативным аргументом, при совместимости типов. Например, теперь следующий код является допустимым:
class A public function method ( int $many , string $parameters , $here ) <>
>
class B extends A public function method (. $everything ) <>
>
?>?php
class Test public function create (): static return new static();
>
>
?>?php
$fn = fn() => throw new Exception ( ‘Исключение в стрелочной функции’ );
$user = $session -> user ?? throw new Exception ( ‘Должен быть пользователь’ );?php
function functionWithLongSignature (
Type1 $parameter1 ,
Type2 $parameter2 , // ) >?php
class ParentClass private function method1 () <>
private function method2 () <>
private static function method3 () <>
// Выдаёт предупреждение, так как «final» больше не имеет значения:
private final function method4 () <>
>
class ChildClass extends ParentClass // Теперь все следующее разрешено, хотя модификаторы не такие же,
// как для закрытых методов в родительском классе.
public abstract function method1 () <>
public static function method2 () <>
public function method3 () <>
public function method4 () <>
>
?>?php
Дата и время
- Были добавлены DateTime::createFromInterface() и DateTimeImmutable::createFromInterface() .
- Добавлен спецификатор формата DateTime p , который аналогичен P , но возвращает Z , а не +00:00 для UTC.
DOM
Добавлены DOMParentNode и DOMChildNode с новыми API-интерфейсами обхода и управления.
Фильтрация данных
FILTER_VALIDATE_BOOL был добавлен в качестве псевдонима для FILTER_VALIDATE_BOOLEAN . Новое имя является предпочтительным, так как оно использует имя канонического типа.
Enchant
FPM
Добавлена новая опция pm.status_listen , позволяющая получать статус с другой конечной точки (например, порта или файла UDS). Это может пригодится для получения статуса, когда все дочерние элементы заняты обработкой долговыполняемых запросов.
Hash
Теперь объекты HashContext можно сериализовать.
Функции интернационализации
LDAP
Добавлена функция ldap_count_references() , которая возвращает количество ссылочных сообщений в результатах поиска.
OPcache
Если ini-параметр opcache.record_warnings включён, OPcache будет записывать предупреждения во время компиляции и воспроизводить их при следующем включении, даже если они обслуживаются из кеша.
OpenSSL
- openssl_cms_encrypt() шифрует сообщение в файле с сертификатами и выводит результат в предоставленный файл.
- openssl_cms_decrypt() расшифровывает сообщение S/MIME в файле и выводит результаты в предоставленный файл.
- openssl_cms_read() экспортирует файл CMS в массив сертификатов PEM .
- openssl_cms_sign() подписывает сообщение MIME в файле сертификатом и ключом и выводит результат в предоставленный файл.
- openssl_cms_verify() проверяет, что блок данных не повреждён, подписывающая сторона является тем, кем она являются и возвращает сертификаты подписывающих сторон.
Регулярные выражения (совместимые с Perl)
Добавлена функция preg_last_error_msg() , которая возвращает человекочитаемое сообщение о последней ошибке PCRE. Она дополняет preg_last_error() , которая возвращает целочисленное значение перечисления.
Reflection
- Следующие методы теперь могут возвращать информацию о значениях параметров внутренних функций по умолчанию:
- ReflectionParameter::isDefaultValueAvailable()
- ReflectionParameter::getDefaultValue()
- ReflectionParameter::isDefaultValueConstant()
- ReflectionParameter::getDefaultValueConstantName()
SQLite3
SQLite3::setAuthorizer() и соответствующие константы классов были добавлены, с помощью которых можно задать собственную callback-функцию для авторизации или запрета действия в базе данных.
Библиотека стандартных функций
- Добавлены функции str_contains() , str_starts_with() и str_ends_with() , которые проверяют, содержит ли haystack , начинается или заканчивается needle соответственно.
- Добавлена функция fdiv() , которая выполняет деление с плавающей точкой в соответствии с IEEE 754. Деление на ноль строго определено и возвращает одно из значений: Inf , -Inf или NaN .
- Добавлена функция get_debug_type() , которая возвращает тип, который может использоваться для генераций сообщений об ошибках. В отличие от gettype() , она использует канонические имена типов, возвращает имена классов объектов и сообщает о типе ресурсов.
- printf() и её производные теперь поддерживают спецификаторы формата %h и %H . Они работают как %g и %G , но всегда используют «.» в качестве десятичного разделителя, а не определяют его с помощью локали LC_NUMERIC.
- printf() и её производные теперь поддерживают использование «*» в качестве ширины или точности, и в этом случае ширина/точность передаётся в качестве аргумента printf. Это также позволяет использовать точность -1 с %g , %G , %h и %H . Например, следующий код можно использовать для воспроизведения форматирования с плавающей точкой по умолчанию PHP:
printf ( «%.*H» , (int) ini_get ( «precision» ), $float );
printf ( «%.*H» , (int) ini_get ( «serialize_precision» ), $float );
?>?php$proc = proc_open ( $command , [[ ‘pty’ ], [ ‘pty’ ], [ ‘pty’ ]], $pipes );
?>?php
$proc = proc_open ( $command , [[ ‘socket’ ], [ ‘socket’ ], [ ‘socket’ ]], $pipes );
?>?php// Работает, даже если $excludes пуст:
array_diff ( $array , . $excludes );
// Работает, даже если $array содержит только один массив:
array_intersect (. $arrays );
?>?phpЛексер (Tokenizer)
PhpToken добавляет объектно-ориентированный интерфейс к PHP-лексеру (tokenizer). Он обеспечивает более единообразное и эргономичное представление, в то же время эффективнее и быстрее.
Zip
- Модуль Zip обновлён до версии 1.19.1.
- Новые методы ZipArchive::setMtimeName() и ZipArchive::setMtimeIndex() для установки времени изменения записи.
- Новый метод ZipArchive::registerProgressCallback() для предоставления обновлений во время закрытия архива.
- Новый метод ZipArchive::registerCancelCallback() , чтобы разрешить отмену во время закрытия архива.
- Новый метод ZipArchive::replaceFile() для замены содержимого записи.
- Новый метод ZipArchive::isCompressionMethodSupported() , чтобы проверить дополнительные возможности сжатия.
- Новый метод ZipArchive::isEncryptionMethodSupported() , чтобы проверить дополнительные функции шифрования.
- Добавлено свойство ZipArchive::lastId для получения значения индекса последней добавленной записи.
- Теперь ошибки можно проверить после закрытия и с помощью свойств ZipArchive::status и ZipArchive::statusSys или метода ZipArchive::getStatusString() .
- Параметр ‘remove_path’ в ZipArchive::addGlob() и ZipArchive::addPattern() теперь обрабатывается как произвольный строковый префикс (для согласованности с ‘add_path’ ), тогда как раньше он интерпретировался как имя каталога.
- Дополнительные функции сжатия/шифрования теперь перечислены в phpinfo.
User Contributed Notes
There are no user contributed notes for this page.
- Миграция с PHP 7.4.x на PHP 8.0.x
- Новая функциональность
- Изменения, ломающие обратную совместимость
- Функциональность, объявленная устаревшей в PHP 8.0.x
- Другие изменения
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy