PHPJuniorTechnical
Каковы основные возможности PHP 8.x (named arguments, match expression, nullsafe operator, fibers)?
PHP 8.x принёс named arguments, выражение match, nullsafe-оператор ?->, fibers для кооперативной многозадачности, union types, enum и JIT-компилятор.
Named arguments (PHP 8.0)
Позволяют передавать аргументы по имени, пропуская необязательные:
<?php
// Без named args — приходится помнить порядок
array_slice($array, 0, 5, true);
// С named args — читаемо
array_slice(array: $array, offset: 0, length: 5, preserve_keys: true);
// Удобно при вызове функций с большим числом опциональных параметров
setcookie(
name: 'token',
value: $jwt,
expires_or_options: time() + 3600,
secure: true,
httponly: true
);
Match expression (PHP 8.0)
Строгий аналог switch с возвращаемым значением, строгим сравнением и отсутствием fall-through:
<?php
$status = 404;
$label = match($status) {
200, 201 => 'Success',
301, 302 => 'Redirect',
404 => 'Not Found',
500 => 'Server Error',
default => 'Unknown',
};
// $label === 'Not Found'
// match бросает UnhandledMatchError, если ни одна ветка не подошла и нет default
$value = match(true) {
$score >= 90 => 'A',
$score >= 75 => 'B',
$score >= 60 => 'C',
default => 'F',
};
Nullsafe operator ?-> (PHP 8.0)
Прекращает цепочку вызовов при null, возвращая null вместо фатальной ошибки:
<?php
// До PHP 8.0
$city = null;
if ($user !== null && $user->getAddress() !== null) {
$city = $user->getAddress()->getCity();
}
// PHP 8.0+
$city = $user?->getAddress()?->getCity();
// Работает и с методами, и со свойствами
$name = $order?->customer?->profile?->fullName;
Fibers (PHP 8.1)
Fibers — примитив кооперативной многозадачности: легковесные корутины, которые можно приостановить (Fiber::suspend()) и возобновить (resume()).
<?php
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('первый yield');
echo 'Получено из resume: ' . $value . PHP_EOL;
Fiber::suspend('второй yield');
});
$first = $fiber->start(); // запускает, останавливается на первом suspend
echo $first . PHP_EOL; // 'первый yield'
$second = $fiber->resume('hello'); // продолжает, передаёт 'hello'
echo $second . PHP_EOL; // 'второй yield'
$fiber->resume(); // завершает fiber
Fibers — основа для async-фреймворков (ReactPHP, Revolt Event Loop, Amphp v3).
Другие важные нововведения PHP 8.x
- Union types (8.0):
int|string,int|null. - Enums (8.1): нативные перечисления с поддержкой backed enums (
enum Status: string). - Readonly properties (8.1) и readonly classes (8.2): иммутабельные значения.
- Intersection types (8.1):
Countable&Iterable. - JIT-компилятор (8.0): ускоряет CPU-bound код до 3×.
- Constructor property promotion (8.0):
public function __construct(private string $name) {}. - First-class callable syntax (8.1):
strlen(...)как Closure. - DNF types (8.2):
(A&B)|null.
Подводные камни
- Named arguments нарушают обратную совместимость при переименовании параметров в вызываемой функции — чужие библиотеки могут это сделать в minor-версии.
matchиспользует строгое сравнение (===), поэтомуmatch('1')не совпадёт с веткой1 =>— в отличие отswitch.- Nullsafe-оператор не работает для записи:
$user?->name = 'x'— синтаксическая ошибка. - Fiber не даёт истинного параллелизма: весь код по-прежнему однопоточный, переключение контекста только там, где вызван
suspend(). - JIT включается только при
opcache.enable=1иopcache.jit_buffer_sizeбольше нуля; по умолчанию он выключен. - Backed enums нельзя расширять (
extends), что ломает привычные паттерны наследования. - Constructor promotion не работает в абстрактных конструкторах и вместе с
unset()в теле конструктора.
Common mistakes
- Сводить php 8 features к названию метода без lifecycle и failure path.
- Игнорировать модель runtime: интерпретируемый runtime PHP 8.x, обычно запускаемый как отдельный запрос в FPM, CLI или worker-процессе.
- Не отделять validation, authorization, transaction boundary и business logic.
What the interviewer is testing
- Объясняет php 8 features через конкретную точку lifecycle в PHP.
- Приводит корректный минимальный пример без вымышленных методов или callbacks.
- Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.