PDA

Просмотр полной версии : Релиз языка программирования PHP 8.0


Suicide
26.11.2020, 19:57
После года разработки представлен (https://www.php.net/archive/2020.php#2020-11-26-3) релиз языка программирования PHP 8.0 (https://www.php.net/releases/8.0/en.php). Новая ветка включает серию новых возможностей, а также несколько изменений, нарушающих совместимость (https://www.php.net/manual/en/migration80.incompatible.php).

Ключевые улучшения (https://www.php.net/manual/en/migration80.php) в PHP 8.0:


Включение (https://wiki.php.net/rfc/jit) JIT-компилятора (https://www.opennet.ru/opennews/art.shtml?num=50428). PHP транслирует исходные тексты PHP-скриптов в промежуточное представление (байткод), которое затем выполняется в виртуальной машине Zend VM. JIT поможет дополнительно поднять производительность за счёт преобразования байткода в специфичный для текущей аппаратной платформы машинный код, который может напрямую исполняться процессором, минуя интерпретатор байткода в Zend VM.

Выигрыш от использования JIT заметен при выполнении конструкций, для которых основное значение имеет производительность CPU, например, интенсивные математические вычисления или обработка в циклах данных, находящихся в оперативной памяти. В некоторых синтетических тестах применение JIT привело к повышению производительности в 2-3 раза. В отдельных вычислительных приложениях наблюдается рост производительности в 1.5–2 раза, но в типовых web-приложениях производительность не сильно отличается от PHP 7.4, так как узким местом является ввод/вывод.

https://www.opennet.ru/opennews/pics_base/0_1606403775.png

Поддержка (https://stitcher.io/blog/php-8-named-arguments) именованных аргументов функций, позволяющих передававать в функцию значения в привязке к именам, т.е. можно передавать аргументы в произвольном порядке и определять необязательные аргументы. Например, "array_fill(start_index: 0, num: 100, value: 50)".

При вызове методов разрешено (https://wiki.php.net/rfc/nullsafe_operator) применение оператора "?", который позволяет инициировать вызов только, если метод присутствует, что позволяет избежать лишних проверок на возврат значения "null". Например, "$dateAsString = $booking->getStartDate()?->asDateTimeString()";

Поддержка union-типов (https://wiki.php.net/rfc/union_types_v2), определяющих коллекции из двух и более типов (например "public function foo(Foo|Bar $input): int|float;").

Поддержка атрибутов (https://wiki.php.net/rfc/attributes_v2) (аннотаций), позволяющих привязать метаданные (например, сведения о типах) к классам без использования синтаксиса Docblock.

Поддержка выражений match (https://wiki.php.net/rfc/match_expression_v2), которые в отличие от switch могут возвращать значения, поддерживают комбинирование условий, используют строгое сравнение типов и не требуют указания "break".

$result = match($input) {

0 => "hello",

'1', '2', '3' => "world",

};

Сокращённый синтаксис (https://wiki.php.net/rfc/constructor_promotion) определения классов, позволяющий объединить определение конструктора и свойств.

Новый тип возвращаемых значений - static (https://wiki.php.net/rfc/static_return_type).

Новый тип - mixed (https://wiki.php.net/rfc/mixed_type_v2), который может применяться для определения приёма функцией параметров с разными типами.

Выражение throw (https://wiki.php.net/rfc/throw_expression) для обработки исключений.

WeakMap (https://wiki.php.net/rfc/weak_maps) для создания объектов, которыми можно пожертвовать при сборке мусора (например, для хранения необязательных кэшей).

Возможность (https://wiki.php.net/rfc/class_name_literal_on_object) использования выражения "::class" для объектов (аналог вызова get_class()).

Возможность (https://wiki.php.net/rfc/non-capturing_catches) определения в блоке catch исключений, не привязанных к переменным.

Возможность (https://wiki.php.net/rfc/trailing_comma_in_parameter_list) оставления символа запятой после последнего элемента в списке параметров функции.

Новый интерфейс Stringable (https://wiki.php.net/rfc/stringable) для идентификации любых строковых типов или данных, которых можно преобразовать в строку (для которых доступен метод__toString()).

Новая функция str_contains() (https://wiki.php.net/rfc/str_contains), упрощённый аналог strpos для определения вхождения подстроки, а также функции str_starts_with() и str_ends_with() для проверки совпадений в начале и конце строки.

Добавлена функция fdiv() (https://github.com/php/php-src/pull/4769), выполняющая операцию деления без вывода ошибки в случае деления на ноль.

Изменена (https://wiki.php.net/rfc/concatenation_precedence) логика соединения строк. Например, выражение 'echo "sum: " . $a + $b' ранее интерпретировалось как 'echo ("sum: " . $a) + $b', а в PHP 8 будет обработано как 'echo "sum: " . ($a + $b)'.

Ужесточена (https://wiki.php.net/rfc/arithmetic_operator_type_checks) проверка арифметических и битовых операций, например, выражения "[] % [42]" и "$object + 4" будут приводить к ошибке.

Реализован (https://wiki.php.net/rfc/stable_sorting) стабильный алгоритм сортировки, в котором при разных запусках сохраняется порядок следования одинаковых значений.

Изменено поведение при сравнении строковых и числовых типов.
https://d.radikal.ru/d43/2011/33/0d8177145c8f.png

26.11.2020

https://www.opennet.ru/opennews/art.shtml?num=54151​