Что нового в PHP 8?

RedDeveloper
29.04.2023 10:01
Что нового в PHP 8?

# Что нового в PHP 8? 🚀

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

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

Одной из важнейших особенностей 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 сравним с другими языками в плане производительности и возможностей?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.