
# Что нового в 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 в 2026-2027 годах? Или это полная лажа?".

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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.