В 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;
$code = 200;
$message = match ($code) {
200, 201 => 'Success',
400 => 'Bad Request',
404 => 'Not Found',
default => 'Unknown',
};
echo $message; // Выведет: Success
function createUser($name, $age = 18, $role = 'user') {
echo "Name: $name, Age: $age, Role: $role";
}
// Использование именованных аргументов:
createUser(name: 'John', role: 'admin');
$haystack = 'Hello, world!';
$needle = 'world';
if (str_contains($haystack, $needle)) {
echo 'String contains the word "world".';
}
echo fdiv(1, 0); // INF
echo fdiv(-1, 0); // -INF
echo fdiv(0, 0); // NaN
class User {
public function __construct(
public string $name,
public int $age,
public string $role = 'user'
) {}
}
$user = new User('John', 25);
echo $user->name; // John
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");
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
class User {
public function __construct(
public readonly string $name
) {}
}
$user = new User('Alice');
// $user->name = 'Bob'; // Ошибка: нельзя изменить readonly свойство
$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