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.*