# Что нового в PHP 8? 🚀
PHP 8 - это последний крупный релиз популярного языка сценариев. Он содержит множество новых функций и оптимизаций, которые делают PHP быстрее, выразительнее и последовательнее. В этой статье мы рассмотрим некоторые из наиболее интересных изменений в PHP 8 и узнаем, как они могут улучшить наш код. Давайте начнем!
Одной из важнейших особенностей PHP 8 является JIT-компилятор, что расшифровывается как Just in Time. Эта функция значительно повышает производительность за счет компиляции частей кода во время выполнения, вместо того, чтобы интерпретировать их построчно. JIT-компилятор действует как кэшированная версия кода, которая может выполняться быстрее и эффективнее.
Чтобы включить JIT-компилятор, необходимо установить опцию `opcache.jit_buffer_size` в файле `php.ini`. Рекомендуемое значение - `100M`. Вы также можете настроить другие опции для тонкой настройки поведения JIT, такие как `opcache.jit_debug`, `opcache.jit_tracing_trigger` и `opcache.jit_bisect_limit`.
Еще одна возможность, которая делает PHP 8 более выразительным, - это объединение типов. Эта функция позволяет вам указывать несколько типов для переменной или параметра, используя оператор `|`. Например, вы можете сказать, что функция возвращает целое число или число с плавающей точкой:
function add(int|float $a, int|float $b): int|float { return $a + $b; } ```
Таким образом, вы можете избежать использования аннотаций PHPDoc или смешанных типов, а также сделать свой код более безопасным для типов и самодокументируемым. Союзные типы также работают с nullable типами, используя оператор `?`:
function greet(?string $name): string { return “Hello, “ . $name ?? “world”; } ```
Static - это специальное имя класса, которое относится к классу, который был вызван во время выполнения. В PHP 8 static становится допустимым возвращаемым типом, наряду с self и parent. Это означает, что вы можете использовать static для указания на то, что метод возвращает экземпляр того же класса, который был вызван:
class Foo { public function test(): static { return new static(); } } class Bar extends Foo {} var_dump((new Foo)->test()); // object(Foo)#1 var_dump((new Bar)->test()); // object(Bar)#2
Эта возможность полезна для реализации беглых интерфейсов или паттерна фабрики.
Атрибуты - это способ добавления структурированных метаданных в ваш код, используя родной синтаксис PHP. Вместо использования аннотаций PHPDoc, вы можете использовать атрибуты для объявления такой информации, как маршруты, правила проверки, теги инъекции зависимостей и т.д.
Чтобы определить атрибут, необходимо использовать атрибут `#[Attribute]` на классе. Затем вы можете использовать атрибут в любом элементе вашего кода, таком как классы, методы, свойства, параметры и т.д. Например:
#[Attribute] class Route { public function __construct( public string $path, public array $methods ) {} } #[Route(“/api/posts/{id}”, [“GET”])] class PostsController { public function get($id) { // … } }
Чтобы получить доступ к атрибутам элемента, нужно использовать API `Reflection` и вызвать метод `getAttributes()`.
Продвижение свойств конструктора - это функция, которая сокращает объем кода, необходимого для определения и инициализации свойств. С помощью этой функции вы можете объявить свойство и присвоить ему значение из параметра конструктора за один шаг:
class Point { public function __construct( public float $x = 0.0, public float $y = 0.0, public float $z = 0.0, ) {} } $p = new Point(1.0, 2.0, 3.0); echo $p->x; // 1 echo $p->y; // 2 echo $p->z; // 3
Как видите, эта функция делает код более лаконичным и читабельным.
В PHP 8 есть много других возможностей и улучшений, о которых мы не рассказали в этой статье, например:
- **Матч-выражение**: Новый способ написания операторов switch, который является более лаконичным и безопасным. Выражения совпадения являются выражениями, то есть они могут возвращать значение и не нуждаются в операторе break. Они также используют строгое сравнение и выбрасывают исключение, если совпадение не найдено.
- **Оператор Nullsafe**: Новый оператор, позволяющий выстраивать цепочки вызовов без проверки на нулевые значения. Если один из элементов цепочки равен null, вся цепочка оценивается как null и выполнение останавливается.
- **Именные аргументы**: Новый способ передачи аргументов в функции путем указания имени параметра, вместо того чтобы полагаться на порядок. Это делает код более читабельным и позволяет пропускать необязательные параметры.
- Интерфейс **Stringable**: Новый интерфейс, который автоматически реализуется любым классом, имеющим метод `__toString()`. Это позволяет использовать любой объект stringable там, где ожидается строка, без явного вызова метода `__toString()`.
- **WeakMap**: Новая структура данных, которая хранит ссылки на объекты, не предотвращая их сборку в мусор. Это полезно для реализации кэшей, контейнеров инъекции зависимостей, слушателей событий и т.д.
- **Улучшения системы типов**: PHP 8 вводит множество улучшений в систему типов, таких как смешанный тип, тип throw, незахватывающие уловки, запятая в списках параметров и т.д.
PHP 8 - это крупное обновление, которое привносит в язык множество новых возможностей и оптимизаций. Оно делает PHP быстрее, выразительнее и последовательнее. Если вы являетесь разработчиком PHP, вам обязательно стоит ознакомиться с PHP 8 и посмотреть, как он может улучшить ваш код и ваши проекты.
Что вы думаете о PHP 8? Вам не терпится опробовать его? Какие функции вам больше всего нравятся? Дайте нам знать в комментариях ниже! 😊
#PHP8 #JIT #UnionTypes #Attributes #ConstructorPropertyPromotion
Вопросы для читателей:
- Вы уже использовали PHP 8? Если да, то каков был ваш опыт?
- Каковы некоторые преимущества и проблемы перехода на PHP 8?
- Как вы думаете, насколько PHP 8 сравним с другими языками в плане производительности и возможностей?
20.08.2023 18:21
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".
20.08.2023 17:46
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
19.08.2023 18:39
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.
19.08.2023 17:22
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!
18.08.2023 20:33
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.
14.08.2023 14:49
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.