PHP: Версии (7.4 - 8.4)

12 вопросов

1 Что нового в PHP 7.4?
  • Typed properties: public int $age;
  • Arrow functions: fn($x) => $x * 2
  • Spread operator в массивах: [...$arr1, ...$arr2]
  • Null coalescing assignment: $x ??= 'default'
  • Preloading: opcache.preload - загрузка классов при старте FPM
  • Numeric literal separator: 1_000_000
  • WeakReference
  • FFI (Foreign Function Interface)
Открыть отдельно →
2 Что нового в PHP 8.0?
  • Named arguments: str_contains(haystack: $s, needle: 'x')
  • Match expression: строгое сравнение, возвращает значение
  • Union types: int|string
  • Nullsafe operator: $user?->getAddress()?->getCity()
  • Constructor property promotion
  • Attributes: #[Route('/api')]
  • JIT компиляция
  • str_contains, str_starts_with, str_ends_with
  • WeakMap
  • throw как выражение: $value ?? throw new Exception()
  • Изменение сравнения 0 == "foo" (теперь false)
Открыть отдельно →
3 Что нового в PHP 8.1?
  • Enums: unit и backed enum
  • Fibers: кооперативная многозадачность
  • Intersection types: A&B
  • Readonly properties: public readonly string $name
  • First-class callable syntax: strlen(...)
  • Never return type: функция не возвращает (throw/exit)
  • array_is_list()
  • Константы в enum
Открыть отдельно →
4 Что нового в PHP 8.2?
  • Readonly classes: все свойства автоматически readonly
  • DNF types: (A&B)|C (Disjunctive Normal Form)
  • Constants in traits
  • Standalone true, false, null types
  • Deprecated dynamic properties (нужен #[AllowDynamicProperties])
  • Random extension: новый ООП-интерфейс для рандома
  • SensitiveParameter атрибут (скрывает в stack trace)
Открыть отдельно →
5 Что нового в PHP 8.3?
  • Typed class constants: const string VERSION = '1.0'
  • json_validate(): быстрая проверка JSON без декодирования
  • #[\\Override] атрибут: ошибка если метод не переопределяет родительский
  • Deep cloning readonly properties
  • Randomizer расширение: getBytesFromString(), getFloat(), nextFloat()
  • Улучшенные сообщения об ошибках
Открыть отдельно →
6 Что нового в PHP 8.4?
  • Property hooks: get/set хуки для свойств
  • Asymmetric visibility: public private(set) string $name
  • new без скобок: new User->getName()
  • HTML5 парсер: Dom\HTMLDocument
  • Lazy objects: нативные ленивые объекты
  • Multibyte trim: mb_trim(), mb_ltrim(), mb_rtrim()
  • array_find(), array_find_key(), array_any(), array_all()
Открыть отдельно →
7 Что такое атрибуты (Attributes)?
// Объявление атрибута
#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
class Route {
    public function __construct(
        public string $path,
        public string $method = 'GET',
    ) {}
}

// Использование
class UserController {
    #[Route('/users', method: 'GET')]
    #[Route('/users/list', method: 'GET')]
    public function list(): Response { /* ... */ }
}

// Чтение через Reflection
$ref = new ReflectionMethod(UserController::class, 'list');
$attrs = $ref->getAttributes(Route::class);
foreach ($attrs as $attr) {
    $route = $attr->newInstance();
    echo "$route->method $route->path\n";
}

Атрибуты заменяют docblock-аннотации (@Route). Нативная поддержка PHP, проверка типов, IDE-подсказки.

Открыть отдельно →
8 Что такое match выражение?
// match - строгое сравнение (===), возвращает значение
$result = match($status) {
    'active' => 'Активен',
    'banned', 'blocked' => 'Заблокирован', // несколько значений
    default => 'Неизвестно',
};

// Без аргумента - как if/elseif
$category = match(true) {
    $age < 18 => 'child',
    $age < 65 => 'adult',
    default => 'senior',
};

Отличия от switch: строгое сравнение (===), нет fallthrough, возвращает значение, UnhandledMatchError если нет совпадения (без default).

Открыть отдельно →
9 Что такое Null-coalescing и Null-safe операторы?
// ?? (Null coalescing) - значение по умолчанию если null
$name = $user->name ?? 'Anonymous';
$config = $data['key'] ?? $fallback ?? 'default';

// ??= (Null coalescing assignment, PHP 7.4)
$options['timeout'] ??= 30; // установить если null

// ?-> (Nullsafe operator, PHP 8.0) - цепочка вызовов с проверкой null
$city = $user?->getAddress()?->getCity()?->getName();
// Вместо:
// $city = $user !== null && $user->getAddress() !== null && ...

// ?-> возвращает null при первом null в цепочке
// Нельзя использовать для записи: $user?->name = 'x'; // Error
Открыть отдельно →
10 Что такое Intersection Types?
// Intersection type (PHP 8.1): объект должен реализовать ВСЕ типы
function process(Countable&Iterator $collection): void {
    echo count($collection);
    foreach ($collection as $item) { /* ... */ }
}

// DNF types (PHP 8.2): комбинация union и intersection
function handle((Countable&Iterator)|null $data): void { /* ... */ }

// Практический пример
interface Cacheable {}
interface Serializable {}

function store(Cacheable&Serializable $item): void {
    // $item гарантированно реализует оба интерфейса
}

Intersection types полезны когда нужно требовать реализацию нескольких интерфейсов без создания промежуточного интерфейса.

Открыть отдельно →
11 Что такое файберы (Fibers)?
// Fiber (PHP 8.1) - кооперативная многозадачность
$fiber = new Fiber(function (): void {
    $value = Fiber::suspend('первая пауза');
    echo "Получил: $value\n";
    Fiber::suspend('вторая пауза');
});

$result = $fiber->start();    // "первая пауза"
$result = $fiber->resume('данные'); // "Получил: данные", "вторая пауза"
$fiber->resume();

Fibers - низкоуровневый механизм для асинхронных фреймворков (ReactPHP, Amp, Revolt). Не для прямого использования в приложениях. Позволяют писать асинхронный код в синхронном стиле.

Открыть отдельно →
12 Какие версии PHP в настоящее время поддерживаются?

По состоянию на 2025-2026:

  • PHP 8.4 (Nov 2024) - активная поддержка
  • PHP 8.3 (Nov 2023) - активная поддержка
  • PHP 8.2 (Dec 2022) - только security fixes
  • PHP 8.1 (Nov 2021) - end of life
  • PHP 8.0 и ниже - не поддерживаются

Каждая версия получает 2 года активной поддержки + 1 год security-only. Рекомендация: использовать последнюю стабильную версию (8.4).

Открыть отдельно →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.