8 лучших новых функций в PHP 8
PHP 8 был выпущен в конце ноября 2020 года. Это основная новая версия, которая обновляет язык дополнительными функциями и улучшениями производительности.
В этой статье мы рассмотрим восемь самых больших улучшений, предлагаемых PHP 8. Полный список дополнений и изменений можно найти в официальной документации. Документация также включает исчерпывающее руководство по миграции для использования при обновлении проектов с PHP 7.4.
1. Атрибуты
Атрибуты, также известные как аннотации на других языках, предоставляют механизм для добавления метаданных в базу кода. Атрибуты могут использоваться с классами, методами, функциями и свойствами. С ними проще работать, чем с подходом docblock, принятым во многих проектах PHP 7.
Атрибуты определяются как простые классы, сами аннотированные встроенным в PHP атрибутом Attribute
:
#[Attribute] class CloudSavvyAttribute { protected string $value; public function __construct(string $value) { $this ->; value = $value; } public function getValue() : string { return $this ->; value; } }
Затем их можно прикрепить к сущностям в вашей кодовой базе:
#[CloudSavvyAttribute("Example")] class CloudSavvyClass { // ... }
Атрибуты извлекаются через Reflection API. Вы можете проверять и создавать атрибуты, определенные в классе, методе или другом компоненте кодовой базы. Атрибуты, вероятно, будут наиболее полезны в фреймворках и библиотеках, где они помогут абстрагироваться от одноразового сопоставления компонентов приложения, таких как определения маршрутов и проводники внедрения зависимостей.
2. Именованные аргументы
Именованные аргументы позволяют передавать параметры методам и функциям с помощью конструкции, подобной массиву. Это упрощает пропуск необязательных параметров и передачу их не по порядку.
function foo(?string $a=null, ?string $b=null, ?string $c=null) : void;
В PHP 7 для вызова указанной выше функции при передаче значения \demo\
в $c
требовался следующий вызов:
foo(null, null, "demo");
Вместо этого в PHP 8 можно использовать следующий синтаксис:
foo(c: "demo");
Это делает вызовы функций с большим количеством необязательных аргументов менее повторяющимися и более простыми в обслуживании.
3. Продвижение недвижимости конструктора
Заполнение свойств класса начальными значениями — одна из наиболее частых ролей конструктора. Код, подобный следующему, является обычным в кодовых базах PHP 7:
class Example { protected ?string $Property; public function __construct(?string $Property=null) { $this ->; Property = $Property; } }
В PHP 8 добавлена поддержка Constructor Property Promotion, сокращенный синтаксис, который позволяет вам комбинировать определение свойства, подсказки типов и заполнение, встроенные в сигнатуру конструктора. Приведенный выше пример можно было бы переписать следующим образом:
class Example { public function __construct( protected string $Property=null ) }
Этот стиль исключает повторение. Его использование упрощает добавление дополнительных свойств конструктора в будущем, уменьшая количество разделов кода, которые необходимо изменить.
4. Типы союзов
Система типов PHP продолжает развиваться с выходом PHP 8. Теперь можно указывать типы как «объединение» двух или более типов, где значение типа может быть получено из любого из типов в объединении.
public function foo(string|int $bar) : int|float;
В придуманном выше примере функция foo()
принимает как строки, так и целые числа. Он вернет либо целое число, либо число с плавающей запятой.
На практике эта возможность, вероятно, будет наиболее полезной при применении к свойствам и параметрам метода — хорошим тоном будет принимать различные типы входных данных и нормализовать их к четко определенному единственному выходному типу.
5. Подбери выражение
Новое выражение match
— более лаконичная и безопасная альтернатива хорошо известному switch
. Он не требует использования операторов case
и break
, поддерживает комбинированные условия и возвращает значение вместо ввода нового блока кода. Приведение типов отключено, поэтому 1.0
(с плавающей запятой) не считается эквивалентным \1.0\
(строка), в отличие от использования switch
.
Вот типичный переключатель
PHP 7:
switch (1.0) { case 1.0: $result = "Float!"; break; case "foo": case "bar": $result = "foobar!"; break; }
И вот как тот же код мог бы выглядеть с PHP 8:
$result = match (1.0) { 1.0 =>; "Float!", "foo", "bar" =>; "foobar!" }
Опять же, новый подход гораздо более лаконичен. Одно предостережение, на которое следует обратить внимание, заключается в том, что синтаксические значения комбинированных условий определяются не в массиве, а в виде простого набора с разделителями-запятыми, похожего на вызов функции.
6. Оператор «Nullsafe»
Еще одна концепция, заимствованная из других языков, PHP 8 теперь поддерживает встроенную проверку нулей с автоматическим коротким замыканием. Вы можете создать цепочку проверок, которые будут прерваны, возвращая null
, когда оценка любого элемента не удалась.
В PHP 7:
$photo = null; if ($user !== null) { if ($user ->; profile !== null) { if ($user ->; profile ->; getPhoto() !== null) { $photo = $user ->; profile ->; getPhoto() ->; getPath(); } } }
И в PHP 8:
$photo = $user? ->; profile? ->; getPhoto()? ->; getPath();
PHP 8 снова предоставляет более простое решение, исключающее вложенность. Это приводит к значительно меньшему количеству кода для тестирования и поддержки.
7. Более строгая система типов
Мы уже рассмотрели, как Union Types добавляет еще один уровень гибкости в систему типов PHP 8. Ряд дополнительных изменений в этой области повышает строгость и согласованность проверки типов.
Сравнение строк с числами теперь более разумно. 0
(целое число) больше не эквивалентно \\
(пустая строка) и сравнениям, таким как 123 == \123abc\
теперь оценка false
, а не true
. Эти изменения помогают уменьшить вероятность ошибок сравнения в вашей кодовой базе, хотя может потребоваться некоторая работа, чтобы обеспечить совместимость старых проектов.
Система типов также получила явный тип mixed
(чтобы указать, что любое значение совместимо), а также возвращаемый тип static
(поддерживающий позднее статическое связывание). В других местах сигнатуры абстрактных методов в типажах теперь проверяются правильно.
В целом, эти изменения улучшают поддержку строго типизированного программирования в PHP. Последовательное использование подсказок типов устраняет многие ошибки, которые могут существовать в слабо типизированных языках, давая разработчикам большую уверенность в том, что код работает так, как задумано.
8. ТОЧНО
Последняя запись в нашем списке — это скорее закулисная возможность, а не языковая функция. В PHP 8 добавлена поддержка компиляции Just-In-Time, которая может значительно повысить производительность.
JIT-компиляция, скорее всего, принесет пользу длительным сценариям с повторяющимися задачами. Тесты показывают, что улучшение будет менее заметным в веб-приложениях, где чаще всего встречается PHP. Однако добавление JIT может помочь PHP расшириться в другие области программирования, повысив общую привлекательность и универсальность языка.
JIT должен быть включен с помощью новых настроек в файле конфигурации php.ini
. Подробное руководство по доступным значениям и их эффектам можно найти в документации; однако в качестве общего значения по умолчанию рекомендуется следующее:
<code>opcache.enable=1 opcache.jit_buffer_size=100M opcache.jit=1255</code>
Заключение
Мы рассмотрели только восемь наиболее значительных дополнений и изменений в PHP 8. Прежде чем начать использовать PHP 8 в своих проектах, стоит просмотреть официальные примечания к выпуску, так как есть еще много второстепенных функций, которые мы не смогли здесь описать. .
Хотя большинство изменений обратно совместимы, потенциальные ошибки включают усовершенствования системы типов и изменения в стандартной библиотеке. Вы можете найти полное руководство по миграции на сайте документации PHP.