PHP 8 принес значительные изменения в язык, которые стоит разобрать подробно.
Атрибуты заменяют докблок-аннотации и предоставляют структурированный способ добавления метаданных к коду.
#[Route("/api/posts", methods: ["GET"])]
class PostController
{
#[Autowired]
private PostRepository $repository;
#[Cache(3600)]
public function list(): array
{
return $this->repository->findAll();
}
}
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_CLASS)]
class Cache {
public function __construct(
public int $lifetime
) {}
}
Union Types позволяют указывать несколько допустимых типов для параметров, возвращаемых значений и свойств.
function parseValue(string|int|float $value): string|array
{
if (is_numeric($value)) {
return (string)$value;
}
return explode(',', $value);
}
void
и never
?Type
или Type|null
)@param
и @return
Улучшенная альтернатива switch
с более строгой семантикой и возвращаемым значением.
// Старый вариант
switch ($statusCode) {
case 200:
case 204:
$message = 'OK';
break;
case 404:
$message = 'Not found';
break;
default:
$message = 'Unknown status';
}
// Новый вариант с match
$message = match($statusCode) {
200, 204 => 'OK',
404 => 'Not found',
default => 'Unknown status',
};
===
)class User {
public function __construct(
public string $name,
protected int $age,
private bool $isAdmin = false
) {}
}
$country = $user?->getAddress()?->getCountry()?->getName();
array_fill(start_index: 0, num: 100, value: 50);
Включение в php.ini:
opcache.enable=1
opcache.jit_buffer_size=100M
opcache.jit=tracing
#[ApiResource]
class ProductController
{
public function __construct(
private ProductRepository $repository,
private CacheInterface $cache
) {}
#[Route('/products/{id}', methods: ['GET'])]
public function show(int|string $id): Product|Response
{
return $this->cache->get(
key: "product_$id",
default: fn() => $this->repository->findById($id) ?? throw new NotFoundHttpException()
);
}
}
Анализ кода:
phpstan analyse --level=max
Автоматические исправления:
rector process src --set php80
Тестирование:
composer require phpunit/phpunit:^9.5 --dev
PHP 8 представляет значительный эволюционный скачок для языка, вводя современные функции вроде атрибутов, union types и match-выражений, которые делают код более выразительным и безопасным. Эти изменения требуют изучения, но значительно повышают качество и поддерживаемость кодовой базы.