Анонімні класи

Анонімні класи

Давня фіча, яку безліч розробників досі ігнорують

  • Додано у версії: PHP 7.0
  • Що дає: можливість створювати клас “на льоту” — без імені, без окремого файлу, просто у місці, де він реально потрібен.

Чому про це варто згадати

Попри те, що анонімні класи з’явилися ще у PHP 7, спілкування з розробниками показує приблизно таку статистику:

  • 9 з 10 не бачать для них “практичного сенсу”;
  • 7 з 10 — ніколи не пробували створити new class {} навіть у петпроєктах або чернетках.

А дарма — це інструмент, який ідеально підходить для тимчасових об’єктів, адаптерів, обгорток і стратегій.

Коли анонімні класи реально зручні

  • коли потрібен mock обʼєкт для тестів;
  • коли треба підмінити поведінку об’єкта лише тут і зараз;
  • коли не хочеться створювати окремий клас заради дрібної логіки;
  • коли потрібно “локально” адаптувати чи розширити поведінку;
  • коли потрібен короткий об’єкт із власним станом або кількома методами.

Реальні приклади застосування

Не буду наводити приклад створення mockів для тестів, цих прикладів повно в інтернеті, натомість поділюся більш практичним застосуванням анонімних класів.

Тимчасовий адаптер

$adapter = new class($apiClient) implements PaymentGateway 
{
    public function __construct(private ApiClient $api) {}

    public function pay(float $amount): bool {
        return $this->api->request('/pay', ['sum' => $amount]);
    }
};

$adapter->pay(9.99);

Пара рядків — і є готовий адаптер без створення файлу.

Локальна стратегія або callback-об’єкт

$transformer = new class 
{
    public array $alreadyTransform = [];
    public function transform(int $v): int 
    { 
        return $this->alreadyTransform[$v] ??= $v*10; 
    }
};

$result = array_map(
    $transformer->transform(...),
    [1, 2, 3, 2, 1, 2, 3]
);
var_dump($result); //[10, 20, 30, 20, 10, 20, 30]

Callable з методом і власним станом. Результат отримаємо для сімох елементів, а процес запуститься лише тричі.

Тимчасовий listener для події

$dispatcher->addListener('user.registered', new class {
    public function __invoke(User $user): void {
        // логування, повідомлення, email — все що завгодно
    }
});

Одноразовий слухач — і не треба роздувати кількість файлів в проєкті.

DTO “на льоту”

return new class($user, $stats) {
    public function __construct(
        public User $user,
        public array $stats
    ) {}
    
    public function total(): int {
        return array_sum($this->stats);
    }
};

Коли є зайвим створювати окрему структуру для разового результату.

Висновок

Анонімні класи — це старий, але дуже недооцінений інструмент. Вони економлять час, зменшують кількість файлів і дозволяють тримати тимчасову логіку саме там, де вона потрібна.

Якщо ти теж ще не пробував new class {}, зроби це сьогодні. Можливо, відкриєш для себе новий улюблений трюк PHP.

← Попередня: Property Promotion · Уся серія · Наступна: Стрілкові функції →


Вперше опубліковано в Telegram-каналі «Створений щоб помирати» 16.10.2025.