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

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

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


// Без nullsafe оператора:
if ($user !== null && $user->getAddress() !== null) {
$city = $user->getAddress()->city;
}

// С nullsafe оператором:
$city = $user?->getAddress()?->city;

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


$code = 200;

$message = match ($code) {
200, 201 => 'Success',
400 => 'Bad Request',
404 => 'Not Found',
default => 'Unknown',
};

echo $message; // Выведет: Success

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


function createUser($name, $age = 18, $role = 'user') {
echo "Name: $name, Age: $age, Role: $role";
}

// Использование именованных аргументов:
createUser(name: 'John', role: 'admin');

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


$haystack = 'Hello, world!';
$needle = 'world';

if (str_contains($haystack, $needle)) {
echo 'String contains the word "world".';
}

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


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

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


class User {
public function __construct(
public string $name,
public int $age,
public string $role = 'user'
) {}
}

$user = new User('John', 25);
echo $user->name; // John

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


interface Logger {
public function log(string $message): void;
}

trait FileLogger {
public string $file;

public function log(string $message): void {
file_put_contents($this->file, $message);
}
}

class AppLogger implements Logger {
use FileLogger;

public function __construct(string $file) {
$this->file = $file;
}
}

$logger = new AppLogger('app.log');
$logger->log("Log message");

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


enum Status: string {
case Draft = 'draft';
case Published = 'published';
case Archived = 'archived';
}

function setStatus(Status $status) {
echo "The status is {$status->value}";
}

setStatus(Status::Published); // The status is published

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


class User {
public function __construct(
public readonly string $name
) {}
}

$user = new User('Alice');
// $user->name = 'Bob'; // Ошибка: нельзя изменить readonly свойство

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


$fiber = new Fiber(function(): void {
$value = Fiber::suspend('pause');
echo "Resumed with value: $value\n";
});

echo $fiber->start(); // pause
$fiber->resume('continue'); // Resumed with value: continue

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


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