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

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

Ashterix

docs: English JsonRpcBundle docs, REST and MCP Bundle sections, package cards

uk/articles/from-tg/series/php-can-do/anonymous-classes.md новий файл +107 −0

1 + # Анонімні класи
2 +
3 + *Давня фіча, яку безліч розробників досі ігнорують*
4 +
5 + - **Додано у версії:** PHP 7.0
6 + - **Що дає:** можливість створювати клас “на льоту” — без імені, без окремого файлу, просто у місці, де він реально потрібен.
7 +
8 + ## Чому про це варто згадати
9 +
10 + Попри те, що анонімні класи з’явилися ще у PHP 7, спілкування з розробниками показує приблизно таку статистику:
11 +
12 + - 9 з 10 не бачать для них “практичного сенсу”;
13 + - 7 з 10 — ніколи не пробували створити `new class {}` навіть у петпроєктах або чернетках.
14 +
15 + А дарма — це інструмент, який ідеально підходить для тимчасових об’єктів, адаптерів, обгорток і стратегій.
16 +
17 + ## Коли анонімні класи реально зручні
18 +
19 + - коли потрібен mock обʼєкт для тестів;
20 + - коли треба підмінити поведінку об’єкта лише тут і зараз;
21 + - коли не хочеться створювати окремий клас заради дрібної логіки;
22 + - коли потрібно “локально” адаптувати чи розширити поведінку;
23 + - коли потрібен короткий об’єкт із власним станом або кількома методами.
24 +
25 + ## Реальні приклади застосування
26 +
27 + Не буду наводити приклад створення mockів для тестів, цих прикладів повно в інтернеті, натомість поділюся більш практичним застосуванням анонімних класів.
28 +
29 + ### Тимчасовий адаптер
30 +
31 + ```php
32 + $adapter = new class($apiClient) implements PaymentGateway
33 + {
34 + public function __construct(private ApiClient $api) {}
35 +
36 + public function pay(float $amount): bool {
37 + return $this->api->request('/pay', ['sum' => $amount]);
38 + }
39 + };
40 +
41 + $adapter->pay(9.99);
42 + ```
43 +
44 + Пара рядків — і є готовий адаптер без створення файлу.
45 +
46 + ### Локальна стратегія або callback-об’єкт
47 +
48 + ```php
49 + $transformer = new class
50 + {
51 + public array $alreadyTransform = [];
52 + public function transform(int $v): int
53 + {
54 + return $this->alreadyTransform[$v] ??= $v*10;
55 + }
56 + };
57 +
58 + $result = array_map(
59 + $transformer->transform(...),
60 + [1, 2, 3, 2, 1, 2, 3]
61 + );
62 + var_dump($result); //[10, 20, 30, 20, 10, 20, 30]
63 + ```
64 +
65 + Callable з методом і власним станом. Результат отримаємо для сімох елементів, а процес запуститься лише тричі.
66 +
67 + ### Тимчасовий listener для події
68 +
69 + ```php
70 + $dispatcher->addListener('user.registered', new class {
71 + public function __invoke(User $user): void {
72 + // логування, повідомлення, email — все що завгодно
73 + }
74 + });
75 + ```
76 +
77 + Одноразовий слухач — і не треба роздувати кількість файлів в проєкті.
78 +
79 + ### DTO “на льоту”
80 +
81 + ```php
82 + return new class($user, $stats) {
83 + public function __construct(
84 + public User $user,
85 + public array $stats
86 + ) {}
87 +
88 + public function total(): int {
89 + return array_sum($this->stats);
90 + }
91 + };
92 + ```
93 +
94 + Коли є зайвим створювати окрему структуру для разового результату.
95 +
96 + ## Висновок
97 +
98 + > Анонімні класи — це старий, але дуже недооцінений інструмент.
99 + > Вони економлять час, зменшують кількість файлів і дозволяють тримати тимчасову логіку саме там, де вона потрібна.
100 +
101 + Якщо ти теж ще не пробував `new class {}`, зроби це сьогодні. Можливо, відкриєш для себе новий улюблений трюк PHP.
102 +
103 + ← [Попередня: Property Promotion](/articles/from-tg/series/php-can-do/property-promotion) · [Уся серія](/articles/from-tg/series/php-can-do) · [Наступна: Стрілкові функції →](/articles/from-tg/series/php-can-do/arrow-functions)
104 +
105 + ---
106 +
107 + *Вперше опубліковано в Telegram-каналі [«Створений щоб помирати»](https://t.me/php_while_true/73) 16.10.2025.*