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