Полезные новинки в PHP 8.x

В PHP регулярно появляются новые функции и улучшения, особенно в последних версиях (например, PHP 8.x). Вот несколько полезных нововведений и фишек, которые были добавлены в последние версии PHP

1. Nullsafe оператор (?->) — PHP 8.0
Раньше, для того чтобы избежать ошибки при обращении к методу или свойству объекта, который может быть null, приходилось писать громоздкий код с проверками. Теперь это можно сделать гораздо проще.

  1. // Без nullsafe оператора:
  2. if ($user !== null && $user->getAddress() !== null) {
  3. $city = $user->getAddress()->city;
  4. }
  5.  
  6. // С nullsafe оператором:
  7. $city = $user?->getAddress()?->city;

2. Match выражения — PHP 8.0
Match — это более мощная и строгая альтернатива switch. В отличие от switch, match возвращает результат и строго проверяет значения, что делает его более безопасным и лаконичным.

  1. $code = 200;
  2.  
  3. $message = match ($code) {
  4. 200, 201 => 'Success',
  5. 400 => 'Bad Request',
  6. 404 => 'Not Found',
  7. default => 'Unknown',
  8. };
  9.  
  10. echo $message; // Выведет: Success

3. Named аргументы — PHP 8.0
Теперь можно передавать аргументы в функцию по имени, что упрощает работу с функциями с большим количеством аргументов, особенно если используются значения по умолчанию.

  1. function createUser($name, $age = 18, $role = 'user') {
  2. echo "Name: $name, Age: $age, Role: $role";
  3. }
  4.  
  5. // Использование именованных аргументов:
  6. createUser(name: 'John', role: 'admin');

4. Функция str_contains — PHP 8.0
Появилась новая функция для проверки, содержит ли строка подстроку. Она намного более удобна, чем использование strpos.

  1. $haystack = 'Hello, world!';
  2. $needle = 'world';
  3.  
  4. if (str_contains($haystack, $needle)) {
  5. echo 'String contains the word "world".';
  6. }

5. Функция fdiv для деления на ноль — PHP 8.0
fdiv позволяет избежать ошибки деления на ноль, возвращая INF, -INF, или NaN, в зависимости от входных данных.

  1. echo fdiv(1, 0); // INF
  2. echo fdiv(-1, 0); // -INF
  3. echo fdiv(0, 0); // NaN

6. Конструкторы свойств в классах — PHP 8.0
В PHP 8.0 добавлена возможность объявления свойств прямо в сигнатуре конструктора, что сокращает количество кода.

  1. class User {
  2. public function __construct(
  3. public string $name,
  4. public int $age,
  5. public string $role = 'user'
  6. ) {}
  7. }
  8.  
  9. $user = new User('John', 25);
  10. echo $user->name; // John

7. Промоутеры свойств — PHP 8.1
Теперь можно использовать свойства внутри интерфейсов и трейтов, что делает их более гибкими.

  1. interface Logger {
  2. public function log(string $message): void;
  3. }
  4.  
  5. trait FileLogger {
  6. public string $file;
  7.  
  8. public function log(string $message): void {
  9. file_put_contents($this->file, $message);
  10. }
  11. }
  12.  
  13. class AppLogger implements Logger {
  14. use FileLogger;
  15.  
  16. public function __construct(string $file) {
  17. $this->file = $file;
  18. }
  19. }
  20.  
  21. $logger = new AppLogger('app.log');
  22. $logger->log("Log message");

8. Enumns (Перечисления) — PHP 8.1
Это мощный инструмент для создания структурированных наборов данных.

  1. enum Status: string {
  2. case Draft = 'draft';
  3. case Published = 'published';
  4. case Archived = 'archived';
  5. }
  6.  
  7. function setStatus(Status $status) {
  8. echo "The status is {$status->value}";
  9. }
  10.  
  11. setStatus(Status::Published); // The status is published

9. Readonly свойства — PHP 8.1
readonly свойства могут быть установлены только один раз, и их нельзя изменять после инициализации.

  1. class User {
  2. public function __construct(
  3. public readonly string $name
  4. ) {}
  5. }
  6.  
  7. $user = new User('Alice');
  8. // $user->name = 'Bob'; // Ошибка: нельзя изменить readonly свойство

10. Fibers — PHP 8.1
Фибры предоставляют примитив для работы с асинхронным кодом, что делает их полезными для таких задач, как создание каркасов для корутин.

  1. $fiber = new Fiber(function(): void {
  2. $value = Fiber::suspend('pause');
  3. echo "Resumed with value: $value\n";
  4. });
  5.  
  6. echo $fiber->start(); // pause
  7. $fiber->resume('continue'); // Resumed with value: continue

11. Маскировка ошибок с помощью @ улучшена — PHP 8.0
Теперь ошибки, замаскированные с помощью оператора @, не подавляют критические ошибки, такие как ParseError или TypeError, что повышает безопасность кода.


  12.10.24 / 07:39 | PHP |   52 | 2   0