#course #php #talks #4students #tips
🧮 Який в тебе масив — асоціативний чи індексований?
В PHP масив — це універсальний інструмент, який не вимагає від тебе визначати розмір, тип елементів чи навіть структуру ключів. Це з одного боку ніби і зручно, але з іншого — є проблемою.
Більшість мов програмування виділяють масиви (indexed arrays) і словники/мапи (associative arrays), а в PHP це одна й та ж сама структура, будь-який масив може стати асоціативним або нумерованим в залежності від ключів, які ти використовуєш:
Часто виникає потреба по-різному обробляти масиви в залежності від їх типу. Але PHP не дає такої базової можливості, бо він взагалі не розрізняє індексовані та асоціативні масиви, про що прямо написано в документації.
Можна подумати, що
На перший погляд все добре, але ні.
Розширемо наш приклад, витягнемо з масиву
🙄 Що сталося з масивом? Невже він став асоціативним?
Ні. Просто
Тобто, PHP не ставить знак дорівнює між "нумерованим" та "індексованим" типами масивів.
Ще одна неприємність яка може вас очікувати: рядкові ключі — не гарантують “асоціативність”
Багато хто вважає, що якщо в масиві ключ рядковий — все, це асоціативний масив. Але якщо ключ виглядає як число, PHP конвертує його в int. Наприклад, штрихкоди товарів:
Тому на ключі типу “рядок чи число” теж покладатися не можна.
Висновок:
Чи стикаєтеся ви в роботі з такими складностями і як з них виходите?
🧮 Який в тебе масив — асоціативний чи індексований?
В PHP масив — це універсальний інструмент, який не вимагає від тебе визначати розмір, тип елементів чи навіть структуру ключів. Це з одного боку ніби і зручно, але з іншого — є проблемою.
Більшість мов програмування виділяють масиви (indexed arrays) і словники/мапи (associative arrays), а в PHP це одна й та ж сама структура, будь-який масив може стати асоціативним або нумерованим в залежності від ключів, які ти використовуєш:
$a = [1, 2, 3, 4, 5]; // індексований
$b = ['foo' => 6]; // асоціативний
$c = [
...$a,
...$b
]; // змішаний
Часто виникає потреба по-різному обробляти масиви в залежності від їх типу. Але PHP не дає такої базової можливості, бо він взагалі не розрізняє індексовані та асоціативні масиви, про що прямо написано в документації.
Можна подумати, що
array_is_list може допомогти зʼясувати хто є хтоarray_is_list($a); // true [0=>1, 1=>2, 2=>3, 3=>4, 4=>5]
array_is_list($b); // false [foo=>6]
array_is_list($c); // false [0=>1, 1=>2, 2=>3, 3=>4, 4=>5, foo=>6]
На перший погляд все добре, але ні.
Розширемо наш приклад, витягнемо з масиву
$a тільки непарні числа$a2 = array_filter($a, fn($x) => $x % 2 !== 0); // 1,3,5
array_is_list($a2); // false бо 0=>1, 2=>3, 4=>5
🙄 Що сталося з масивом? Невже він став асоціативним?
Ні. Просто
array_filter зберігає оригінальні ключі. І хоч це все ще числові ключі, але через “дірки” в індексації array_is_list повертає false. Тобто, PHP не ставить знак дорівнює між "нумерованим" та "індексованим" типами масивів.
Ще одна неприємність яка може вас очікувати: рядкові ключі — не гарантують “асоціативність”
Багато хто вважає, що якщо в масиві ключ рядковий — все, це асоціативний масив. Але якщо ключ виглядає як число, PHP конвертує його в int. Наприклад, штрихкоди товарів:
$products = [
"0123456789052" => "Товар",
"8018075001428" => "Ще товар"
];
print_r(array_keys($array));
//Array
//(
// [0] => "0123456789052"
// [1] => 8018075001428 // -- рядок став числом
//)
Тому на ключі типу “рядок чи число” теж покладатися не можна.
Висновок:
Я бачив багато коду, де масив використовують як list, а потім раптово додають рядковий ключ — і все, data integrity накрилась. Якщо твоя логіка дійсно залежить від того, який у тебе масив — перевіряй не array_is_list, а реально структуру ключів (через array_keys, is_int, is_string і т.д.). А ще краще — не лінуйся типізувати і перевіряти дані на вході, навіть якщо це PHP.
Чи стикаєтеся ви в роботі з такими складностями і як з них виходите?
👍9🗿1
#tools #symfony #course #4students
🔄 symfony-docker-installer v.2
Колись на одному з курсів зробив цей інсталятор щоб студенти не витрачали час на налаштування проєкту на Symfony в Docker. З тих пір багато що змінилося і я оновив інсталятор, тепер він повністю автоматизований і працює на make.
Що змінилось?
— Абсолютно новий інсталятор, вся рутина — поза вашою увагою
— В readme є коротка інструкція
— Жодних додаткових дій робити не треба
Як користуватись
1. Скопіюй .
Вкажи
2. Запусти
Введи версію Symfony (або просто натисни Enter — тоді буде остання)
Вкажи git-репозиторій для свого нового проєкту (або Enter, якщо не треба)
⚠️ Будь уважним, бо якщо вкажеш репозиторій, в якому вже є дані, вони видаляться!
3. Далі інсталятор все зробить сам
Для тих, хто хоче спитати чому не просто стандартний docker від Symfony
Відповідь проста: це саме та збірка, якою ми користуємось на курсі.
Тут вже налаштовані make-команди, дебагер, nginx, все для роботи й адекватної розробки.
Замість того, щоб 100500 разів пояснювати кожному, що і як налаштувати для старту — просто даю готовий інструмент, який працює як треба.
Поза курсом використовувати його не обов’язково, але особисто я юзаю подібну збірку у всіх своїх проєктах, бо інакше це марнування часу на одну і ту саму рутину.
🔄 symfony-docker-installer v.2
Колись на одному з курсів зробив цей інсталятор щоб студенти не витрачали час на налаштування проєкту на Symfony в Docker. З тих пір багато що змінилося і я оновив інсталятор, тепер він повністю автоматизований і працює на make.
Що змінилось?
— Абсолютно новий інсталятор, вся рутина — поза вашою увагою
— В readme є коротка інструкція
— Жодних додаткових дій робити не треба
Як користуватись
1. Скопіюй .
env.install.dist у .env.installВкажи
PROJECT_NAME та, якщо треба, інші змінні2. Запусти
make install-init
Введи версію Symfony (або просто натисни Enter — тоді буде остання)
Вкажи git-репозиторій для свого нового проєкту (або Enter, якщо не треба)
⚠️ Будь уважним, бо якщо вкажеш репозиторій, в якому вже є дані, вони видаляться!
3. Далі інсталятор все зробить сам
Для тих, хто хоче спитати чому не просто стандартний docker від Symfony
Відповідь проста: це саме та збірка, якою ми користуємось на курсі.
Тут вже налаштовані make-команди, дебагер, nginx, все для роботи й адекватної розробки.
Замість того, щоб 100500 разів пояснювати кожному, що і як налаштувати для старту — просто даю готовий інструмент, який працює як треба.
Поза курсом використовувати його не обов’язково, але особисто я юзаю подібну збірку у всіх своїх проєктах, бо інакше це марнування часу на одну і ту саму рутину.
GitHub
GitHub - UFO-Tech/symfony-docker-installer
Contribute to UFO-Tech/symfony-docker-installer development by creating an account on GitHub.
🔥9❤1👍1
This media is not supported in your browser
VIEW IN TELEGRAM
#humor
Це я на курсі php-pro показую приклад як в Twig можна робити html верстку
Це я на курсі php-pro показую приклад як в Twig можна робити html верстку
😁20🥴2👍1
#tools #4students
🛠 Швейцарський ніж для розробника
Деякий час тому відкрив для себе DevToys — нереально крутий агрегатор інструментів розробника, який заміняє десятки відкритих вкладок у браузері.
Програма має український інтерфейс, працює офлайн і доступна для Windows, macOS, Debian / Ubuntu.
На борту:
— JSON / YAML / XML форматери
— base64 / URL / HTML енкодер/декодер
— Regex тестер
— Hash генератор (MD5, SHA...)
— UUID генератор
— JWT декодер
— Timestamp ↔️ дата
— Text diff
— Lorem Ipsum
— CSV ↔️ JSON
— тощо
ТОП-3 — Те що Doctor прописав:
🧪 Regex Tester — не зрівняється з regex101 по зручності проєктування і тестування складних шаблонів, але для простих регулярок — ідеальний
🔄 JSON / YAML / XML форматери — рятують, коли отримав щось кудлате і треба це привести до ладу
💻 base64 / URL / HTML енкодер/декодер — часто треба, і приємно, що це під рукою
❗️А ще DevToys має відкритий SDK який дозволяє додавати власні розширення
Дуже раджу спробувати
Встановив — і мінус кілька онлайн-сервісів із закладок.
🛠 Швейцарський ніж для розробника
Деякий час тому відкрив для себе DevToys — нереально крутий агрегатор інструментів розробника, який заміняє десятки відкритих вкладок у браузері.
Програма має український інтерфейс, працює офлайн і доступна для Windows, macOS, Debian / Ubuntu.
На борту:
— JSON / YAML / XML форматери
— base64 / URL / HTML енкодер/декодер
— Regex тестер
— Hash генератор (MD5, SHA...)
— UUID генератор
— JWT декодер
— Timestamp ↔️ дата
— Text diff
— Lorem Ipsum
— CSV ↔️ JSON
— тощо
ТОП-3 — Те що Doctor прописав:
🧪 Regex Tester — не зрівняється з regex101 по зручності проєктування і тестування складних шаблонів, але для простих регулярок — ідеальний
🔄 JSON / YAML / XML форматери — рятують, коли отримав щось кудлате і треба це привести до ладу
💻 base64 / URL / HTML енкодер/декодер — часто треба, і приємно, що це під рукою
❗️А ще DevToys має відкритий SDK який дозволяє додавати власні розширення
Дуже раджу спробувати
Встановив — і мінус кілька онлайн-сервісів із закладок.
❤🔥7👍6🥴1
#humor
Два мої студента після трьох місяців роботи на моєму проєкті
Валентин, Тигран, ніхто не казав, що буде легко 😉
Два мої студента після трьох місяців роботи на моєму проєкті
Валентин, Тигран, ніхто не казав, що буде легко 😉
😁12
Дехто з вас питає, чому я перестав регулярно робити пости.
Причина проста — весь вільний час іде на створення нового відеокурсу по MongoDB, за аналогією з моїм курсом по MySQL.
#sql #course #4students
До речі, якщо ви з MySQL ще не на "ти" — дуже раджу мій курс Бази даних: SQL
В ньому:
• 6 годин відео
• 24 заняття українською мовою
• завдання з розбором, після яких SQL перестає бути страшним
• лише те, що реально потрібно в роботі
Для тих, хто знає мій стиль викладання — формат звичний.
А для інших — ось плейлист на YouTube з кількома відкритими уроками: три перші заняття і одне з фінальних, щоб ви могли зрозуміти чи підійде це для вас
👉 Поспішай поки діє знижка.
Причина проста — весь вільний час іде на створення нового відеокурсу по MongoDB, за аналогією з моїм курсом по MySQL.
#sql #course #4students
До речі, якщо ви з MySQL ще не на "ти" — дуже раджу мій курс Бази даних: SQL
В ньому:
• 6 годин відео
• 24 заняття українською мовою
• завдання з розбором, після яких SQL перестає бути страшним
• лише те, що реально потрібно в роботі
Для тих, хто знає мій стиль викладання — формат звичний.
А для інших — ось плейлист на YouTube з кількома відкритими уроками: три перші заняття і одне з фінальних, щоб ви могли зрозуміти чи підійде це для вас
👉 Поспішай поки діє знижка.
❤5👍3🔥1
#symfony #php #architecture #videoarchive
Symfony 🆚 Laravel
Знайшов і опублікував для вас запис вебінару, який я проводив в травні минулого року
В самому вебінарі не тільки порівняння вказаних фреймворків, а ще й зробив невеличкий огляд на історію розвитку фреймворків в PHP, саме порівняння стартує з 34:40
👍 Ставте лайки або дизлайки, підписуйтесь на канал і робіть все інше, що треба, щоб на YouTube ставало більше україномовного контенту
Приємного перегляду!
Альтернативні думки в коментарях до відео або цього посту вітаються
Symfony 🆚 Laravel
Знайшов і опублікував для вас запис вебінару, який я проводив в травні минулого року
В самому вебінарі не тільки порівняння вказаних фреймворків, а ще й зробив невеличкий огляд на історію розвитку фреймворків в PHP, саме порівняння стартує з 34:40
👍 Ставте лайки або дизлайки, підписуйтесь на канал і робіть все інше, що треба, щоб на YouTube ставало більше україномовного контенту
Приємного перегляду!
Альтернативні думки в коментарях до відео або цього посту вітаються
YouTube
Symfony vs Laravel / Вебінар: 22.05.2024
У цьому відео я порівнюю два найпопулярніші PHP-фреймворки — Symfony та Laravel. Розберемо, чим вони відрізняються за підходами, архітектурою та філософією розробки, які мають переваги й недоліки, та у яких проєктах кожен з них розкриває свій потенціал на…
👍13
#️⃣ #php #longread
💡 Майбутнє PHP: погляд на те, що принесе PHP 9
PHP — живіший, ніж будь-коли 😎
І хоча хтось досі вважає його “динозавром”, мова продовжує еволюціонувати. PHP 9.0 може стати тим самим моментом, коли “магія” поступиться місцем чистоті, а неочікувані трюки — передбачуваності.
🕒 Офіційної дати коли чекати PHP 9 ще немає, але RFC-дискусії вже киплять.
Після 8.5 (і можливо 8.6) ми отримаємо більш суворий, логічний і, що важливо, стабільний PHP.
Тож якщо ти ще не стежиш за RFC — то я поділюся з тобою цією інформацією 👀
1️⃣ Оператори ++ / -- стануть чеснішими
Тепер ніяких дивних перетворень рядків у цифри.
🧩 Менше “магії”
2️⃣ unserialize() кидатиме винятки
🧠 Виключення замість warning
3️⃣ Менше перевизначень типив
🙅♂️ Тепер буде помилка, а не постріл в коліно
4️⃣ Інтерполяція рядків — без зайвої магії
✨ Приведення до єдиного стандарту
5️⃣ Попередження == fatal error
Невизначені змінні, властивості чи звернення до null більше не проходитимуть "якось"
🧱 PHP буде вимогливішим до якості коду — і це добре.
6️⃣ Прибирання старих “речей”
Старі конструктори, застарілі функції, нестандартна логіка — все це піде в архів 📦
Менше сміття, менше двозначностей.
🚀 Підсумок
Якщо твій код вже чистий, суворо типізований і без магії — тобі нема чого боятися 💪
💡 Майбутнє PHP: погляд на те, що принесе PHP 9
PHP — живіший, ніж будь-коли 😎
І хоча хтось досі вважає його “динозавром”, мова продовжує еволюціонувати. PHP 9.0 може стати тим самим моментом, коли “магія” поступиться місцем чистоті, а неочікувані трюки — передбачуваності.
🕒 Офіційної дати коли чекати PHP 9 ще немає, але RFC-дискусії вже киплять.
Після 8.5 (і можливо 8.6) ми отримаємо більш суворий, логічний і, що важливо, стабільний PHP.
Тож якщо ти ще не стежиш за RFC — то я поділюся з тобою цією інформацією 👀
1️⃣ Оператори ++ / -- стануть чеснішими
Тепер ніяких дивних перетворень рядків у цифри.
$a = 'a9';
$a++;
// PHP < 9.0 -> 'b0'
// PHP 9.0 -> TypeError
🧩 Менше “магії”
2️⃣ unserialize() кидатиме винятки
try {
$obj = unserialize($data);
} catch (UnserializationFailedException $e) {
// handle
}🧠 Виключення замість warning
3️⃣ Менше перевизначень типив
$arr = false;
$arr[] = 2;
// PHP < 9.0 -> [2]
// PHP 9.0 -> Error
🙅♂️ Тепер буде помилка, а не постріл в коліно
4️⃣ Інтерполяція рядків — без зайвої магії
$name = "Alex";
echo "Hello $name"; // ✅
echo "Hello {$name}"; // ✅
echo "Hello ${name}"; // ❌ Deprecation
✨ Приведення до єдиного стандарту
5️⃣ Попередження == fatal error
Невизначені змінні, властивості чи звернення до null більше не проходитимуть "якось"
echo $undefinedVar;
// PHP < 9.0 -> Попередження
// PHP 9.0 -> Фатальна помилка
🧱 PHP буде вимогливішим до якості коду — і це добре.
6️⃣ Прибирання старих “речей”
Старі конструктори, застарілі функції, нестандартна логіка — все це піде в архів 📦
Менше сміття, менше двозначностей.
🚀 Підсумок
PHP 9.0 — має кардинально змінити підхід до написання коду та його культури.
Менше вседозволеності, більше контролю.
Якщо твій код вже чистий, суворо типізований і без магії — тобі нема чого боятися 💪
🔥11👍6
#php #course #series
🚀 Чи знаєш ти, що PHP так вміє? 1/10
10 потужних інструментів, які тобі слід використовувати 🧠
Кожен реліз PHP приносить нові можливості, що роблять код коротшим, розумнішим і приємнішим у підтримці.
Але, як показує досвід численних співбесід і консультацій, більшість із них проходять повз увагу навіть досвідчених розробників.
Ця серія — для тих, хто, як і я, прагне по-справжньому розкрити потенціал PHP і кайфувати від розробки 💥
Ми розберемо 10 фіч, які:
🔹 доступні з PHP 5.5, але досі поза увагою
🔹 реально спрощують код
🔹 показують, наскільки PHP універсальний
——————
Перша стаття серії
⚙️ Property Promotion
Менше коду — легше читати 💡
📦 Додано у версії: PHP 8.0
💡 Що дає: можливість оголошувати властивості класу прямо в конструкторі — без дублювання й шаблонного коду.
🚀 Чому це крутіше за старий підхід
— не потрібно окремо описувати властивості та привласнювати їх значення у конструкторі;
— менше шуму — одразу видно структуру класу;
— ідеально підходить для DTO, запитів, VO, команд, конфігів тощо.
🧠 Фактично це "data class" по-PHPшному — коротко, без додаткових бібліотек чи автогенерації коду.
🧱 Реальний приклад застосування
📌 У коді це зменшує бойлерплейт майже втричі, а клас стає самоочевидним.
🧩 Де це реально корисно
— DTO у запитах/відповідях API;
— командні об’єкти в CQRS;
— значення, які описують одну сутність без поведінки (Value Object);
— Symfony-форми, коли треба швидко пробросити дані.
🧭 Висновок
———
Анонімні класи ➡️
🚀 Чи знаєш ти, що PHP так вміє? 1/10
10 потужних інструментів, які тобі слід використовувати 🧠
Кожен реліз PHP приносить нові можливості, що роблять код коротшим, розумнішим і приємнішим у підтримці.
Але, як показує досвід численних співбесід і консультацій, більшість із них проходять повз увагу навіть досвідчених розробників.
Ця серія — для тих, хто, як і я, прагне по-справжньому розкрити потенціал PHP і кайфувати від розробки 💥
Ми розберемо 10 фіч, які:
🔹 доступні з PHP 5.5, але досі поза увагою
🔹 реально спрощують код
🔹 показують, наскільки PHP універсальний
——————
Перша стаття серії
⚙️ Property Promotion
Менше коду — легше читати 💡
📦 Додано у версії: PHP 8.0
💡 Що дає: можливість оголошувати властивості класу прямо в конструкторі — без дублювання й шаблонного коду.
🚀 Чому це крутіше за старий підхід
— не потрібно окремо описувати властивості та привласнювати їх значення у конструкторі;
— менше шуму — одразу видно структуру класу;
— ідеально підходить для DTO, запитів, VO, команд, конфігів тощо.
🧠 Фактично це "data class" по-PHPшному — коротко, без додаткових бібліотек чи автогенерації коду.
🧱 Реальний приклад застосування
// ❌ Раніше
readonly class Product {
public string $sku;
public string $name;
public float $price;
public function __construct(string $sku, string $name, float $price) {
$this->sku = $sku;
$this->name = $name;
$this->price = $price;
}
}
// ✅ Тепер
readonly class Product {
public function __construct(
public string $sku,
public string $name,
public float $price,
) {}
}
📌 У коді це зменшує бойлерплейт майже втричі, а клас стає самоочевидним.
🧩 Де це реально корисно
— DTO у запитах/відповідях API;
— командні об’єкти в CQRS;
— значення, які описують одну сутність без поведінки (Value Object);
— Symfony-форми, коли треба швидко пробросити дані.
class CreateUserCommand {
public function __construct(
public string $email,
public string $password,
public bool $isAdmin = false,
) {}
}🧭 Висновок
✨ Property Promotion — не просто синтаксичний цукор, це офіційний перехід до декларативного стилю.
Код виглядає лаконічніше, без зайвих рядків.
———
Анонімні класи ➡️
👍9❤1🔥1
Anonymous Quiz
21%
1
0%
-1
4%
-7
0%
-5
54%
-3
5%
3
16%
Помилка
🤯3🤝2👍1
#️⃣ #php #course #series
🚀 Чи знаєш ти, що PHP так вміє? 2/10
🧩 Анонімні класи
Давня фіча, яку безліч розробників досі ігнорують 🤷♂️
📦 Додано у версії: PHP 7.0
💡 Що дає: можливість створювати клас “на льоту” — без імені, без окремого файлу, просто у місці, де він реально потрібен.
🧠 Чому про це варто згадати
Попри те, що анонімні класи з’явилися ще у PHP 7, спілкування з розробниками показує приблизно таку статистику:
🔹9 з 10 не бачать для них “практичного сенсу”,
🔹7 з 10 — ніколи не пробували створити
А дарма — це інструмент, який ідеально підходить для тимчасових об’єктів, адаптерів, обгорток і стратегій.
⚙️ Коли анонімні класи реально зручні
— коли потрібен mock обʼєкт для тестів;
— коли треба підмінити поведінку об’єкта лише тут і зараз;
— коли не хочеться створювати окремий клас заради дрібної логіки;
— коли потрібно “локально” адаптувати чи розширити поведінку;
— коли потрібен короткий об’єкт із власним станом або кількома методами.
🧱 Реальний приклад застосування
Не буду наводити приклад створення mockів для тестів, цих прикладів повно в інтернеті, натомість поділюся більш практичним застосуванням анонімних класів.
🔹 Тимчасовий адаптер
✅ Пара рядків і є готовий адаптер без створення файлу.
🔹 Локальна стратегія або callback-об’єкт
✅ Callable з методом і власним станом.
Результат отримаємо для сімох елементів, а процес запуститься лише тричі
🔹 Тимчасовий listener для події
✅ Одноразовий слухач — і не треба роздувати кількість файлів в проєкті
🔹 DTO “на льоту”
✅ Коли є зайвим створювати окрему структуру для разового результату.
🧭 Висновок
🔥 Якщо ти теж ще не пробував
———
⬅️ Property Promotion | Стрілкові функції ➡️
🚀 Чи знаєш ти, що PHP так вміє? 2/10
🧩 Анонімні класи
Давня фіча, яку безліч розробників досі ігнорують 🤷♂️
📦 Додано у версії: 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 | Стрілкові функції ➡️
👍4❤2
This media is not supported in your browser
VIEW IN TELEGRAM
#humor
Коли твій скрипт упав, але ти запускаєш його ще раз — раптом цього разу пощастить 😅
PS: Дивитися до кінця
Коли твій скрипт упав, але ти запускаєш його ще раз — раптом цього разу пощастить 😅
PS: Дивитися до кінця
😁9🤣3🤔1
#️⃣ #php #course #series
🚀 Чи знаєш ти, що PHP так вміє? 3/10
⚡️ Стрілкові функції (Arrow Functions)
Як анонімка, тільки стрункіше
📦 Додано у версії: PHP 7.4
💡 Що дає: компактний синтаксис для коротких функцій, які автоматично бачать змінні з оточення та завжди повертають результат.
🧠 Особливості, які треба знати
— завжди повертають значення
— можуть містити лише один вираз — без
— автоматично успадковують змінні з оточення, без
— читаються як вираз, а не як інструкція.
⚙️ Чому це зручно
— менше шаблонного коду;
— виразність у callback-ах (map, filter, reduce);
— краще читається, особливо в колекціях і стрімах;
— підходить для будь-якого місця, де потрібен мінімалістичний обробник.
🧱 Реальний приклад застосування
🔹 Перетворення масиву
🔹 Фільтрація елементів
🔹 Підрахунок значення
🔹 Простий калькулятор з доступом до зовнішньої змінної
🧭 Висновок
🔥 Якщо тобі потрібен в коді
———
⬅️ Анонімні класи | Генератори ➡️
🚀 Чи знаєш ти, що PHP так вміє? 3/10
⚡️ Стрілкові функції (Arrow Functions)
Як анонімка, тільки стрункіше
📦 Додано у версії: PHP 7.4
💡 Що дає: компактний синтаксис для коротких функцій, які автоматично бачать змінні з оточення та завжди повертають результат.
🧠 Особливості, які треба знати
— завжди повертають значення
— можуть містити лише один вираз — без
{} і багатооператорних блоків;— автоматично успадковують змінні з оточення, без
use($x);— читаються як вираз, а не як інструкція.
⚙️ Чому це зручно
— менше шаблонного коду;
— виразність у callback-ах (map, filter, reduce);
— краще читається, особливо в колекціях і стрімах;
— підходить для будь-якого місця, де потрібен мінімалістичний обробник.
🧱 Реальний приклад застосування
🔹 Перетворення масиву
$prices = [100, 200, 300];
$tax = 0.2;
// ❌ Звичайна анонімна функція
$withTax = array_map(function (int $p) use ($tax) {
return $p * (1 + $tax);
}, $prices);
// ✅ Стрілкова функція
$withTax = array_map(fn(int $p) => $p * (1 + $tax), $prices);
🔹 Фільтрація елементів
$activeUsers = array_filter($users, fn(User $u) => $u->active);
🔹 Підрахунок значення
$total = array_reduce($orders, fn(int $sum, Order $o) => $sum + $o->amount, 0);
🔹 Простий калькулятор з доступом до зовнішньої змінної
$multiplier = 3;
$calc = fn(int $v) => $v * $multiplier;
echo $calc(10); // 30
🧭 Висновок
Стрілкові функції — це лаконічна форма анонімок, створена для чистих, коротких виразів у прямолінійній логіці
🔥 Якщо тобі потрібен в коді
function ($x) use ($y) { return …; } — просто заміни на fn() і відчуй різницю———
⬅️ Анонімні класи | Генератори ➡️
Telegram
Створений щоб помирати
#️⃣ #php #course #series
🚀 Чи знаєш ти, що PHP так вміє? 2/10
🧩 Анонімні класи
Давня фіча, яку безліч розробників досі ігнорують 🤷♂️
📦 Додано у версії: PHP 7.0
💡 Що дає: можливість створювати клас “на льоту” — без імені, без окремого файлу, просто у місці…
🚀 Чи знаєш ти, що PHP так вміє? 2/10
🧩 Анонімні класи
Давня фіча, яку безліч розробників досі ігнорують 🤷♂️
📦 Додано у версії: PHP 7.0
💡 Що дає: можливість створювати клас “на льоту” — без імені, без окремого файлу, просто у місці…
👍5
#️⃣ #php #course #series
🚀 Чи знаєш ти, що PHP так вміє? 4/10
🔄 Генератори
🧠 Старий інструмент, який більшість досі не використовує
📦 Додано у версії: PHP 5.5
💡 Що дає: функції з
⚙️ Реальність така
Хоча генератори існують у PHP з 5.5, на співбесідах більшість розробників або не можуть пояснити, де саме вони реально економлять памʼять, або згадують їх лише теоретично — на кшталт "це щось для великих даних". А по практичним кейсам — нуль ідей.
Тому давайте я накину вам трохи ідей як і де їх можна використовувати.
🧩 Як вони працюють насправді
На відміну від звичайних ітераторів чи масивів:
— генератор не знає, скільки буде елементів;
— не знає, чи є наступний;
— не пам’ятає, чи була попередня ітерація;
— однопрохідний — пройшов, і все, повторно не повернешся.
А попри всі ці “обмеження” — він має одну суттєву перевагу:⚡️ він може призупиняти власне виконання, що дозволяє не тримати в памʼяті всі стани, а тільки поточний.
Це не “масив”, а скоріше потік — і саме тому він безцінний у правильному місці.
🧱 Реальні кейси, де yield справді потрібен
🔹 1. Посторінкове читання з БД
🔸 економія памʼяті колосальна — працює навіть на таблицях у сотні тисяч рядків.
🔹 2. Потоковий парсинг великих файлів
💡 читає рядок за рядком — не вантажить весь CSV в памʼять
🔹 3. Потоковий запис результату в файл
⚙️ відправка великих звітів чи експорту — без буферизації, у реальному часі.
🔹 4. Поступове завантаження з API
⚡️ ідеально для стрімінгової обробки даних без буферизації
🔹 5. Обхід великої файлової структури
📁 ідеально для обходу каталогів, навіть якщо їх тисячі
🧭 Висновок
🔥 Якщо ти колись писав скрипт, який падав через out of memory, —
———
⬅️ Стрілкові функції | DateTimeImmutable ➡️
🚀 Чи знаєш ти, що PHP так вміє? 4/10
🔄 Генератори
🧠 Старий інструмент, який більшість досі не використовує
📦 Додано у версії: PHP 5.5
💡 Що дає: функції з
yield, які повертають елементи поступово — замість того, щоб збирати все в памʼяті й віддавати одразу.⚙️ Реальність така
Хоча генератори існують у PHP з 5.5, на співбесідах більшість розробників або не можуть пояснити, де саме вони реально економлять памʼять, або згадують їх лише теоретично — на кшталт "це щось для великих даних". А по практичним кейсам — нуль ідей.
Тому давайте я накину вам трохи ідей як і де їх можна використовувати.
🧩 Як вони працюють насправді
На відміну від звичайних ітераторів чи масивів:
— генератор не знає, скільки буде елементів;
— не знає, чи є наступний;
— не пам’ятає, чи була попередня ітерація;
— однопрохідний — пройшов, і все, повторно не повернешся.
А попри всі ці “обмеження” — він має одну суттєву перевагу:⚡️ він може призупиняти власне виконання, що дозволяє не тримати в памʼяті всі стани, а тільки поточний.
Це не “масив”, а скоріше потік — і саме тому він безцінний у правильному місці.
🧱 Реальні кейси, де yield справді потрібен
🔹 1. Посторінкове читання з БД
function fetchUsers(PDO $db, int $limit = 500): Generator
{
$offset = 0;
while (true) {
$rows = $db->query("SELECT * FROM users LIMIT $limit OFFSET $offset")->fetchAll();
if (!$rows) break;
yield from $rows;
$offset += $limit;
}
}
🔸 економія памʼяті колосальна — працює навіть на таблицях у сотні тисяч рядків.
🔹 2. Потоковий парсинг великих файлів
function readCsv(string $path): Generator
{
$h = fopen($path, 'r');
while (($row = fgetcsv($h)) !== false) {
yield $row;
}
fclose($h);
}
💡 читає рядок за рядком — не вантажить весь CSV в памʼять
🔹 3. Потоковий запис результату в файл
function streamCsvRows(iterable $data): Generator
{
foreach ($data as $row) {
yield implode(',', $row) . "\n";
}
}
header('Content-Type: text/csv');
foreach (streamCsvRows($repository->getLargeDataset()) as $line) {
echo $line;
flush();
}
⚙️ відправка великих звітів чи експорту — без буферизації, у реальному часі.
🔹 4. Поступове завантаження з API
function fetchPages(ApiClient $client): Generator
{
$page = 1;
do {
$data = $client->getPage($page++);
yield from $data['items'];
} while ($data['has_more']);
}
⚡️ ідеально для стрімінгової обробки даних без буферизації
🔹 5. Обхід великої файлової структури
function scanDirRecursive(string $path): Generator
{
foreach (scandir($path) as $item) {
if ($item === '.' || $item === '..') continue;
$full = "$path/$item";
if (is_dir($full)) {
yield from scanDirRecursive($full);
} else {
yield $full;
}
}
}
foreach (scanDirRecursive('/var/log') as $file) {
echo $file . PHP_EOL;
}
📁 ідеально для обходу каталогів, навіть якщо їх тисячі
🧭 Висновок
Генератори — це інструмент не для зручності, а для ефективності.
Вони не дають можливості перемотати чи дізнатись розмір, але саме тому й дозволяють працювати з необмеженими потоками даних.
🔥 Якщо ти колись писав скрипт, який падав через out of memory, —
yield твій новий друг.———
⬅️ Стрілкові функції | DateTimeImmutable ➡️
👍6👏2
Anonymous Quiz
5%
11
5%
12
28%
56
34%
57
17%
67
12%
Помилка
🔥4👍1
#️⃣ #php #course #series
🚀 Чи знаєш ти, що PHP так вміє? 5/10
⏳ DateTimeImmutable
🧊 Коли час змінюється, а обʼєкти ні
📦 Додано у версії: PHP 5.5
💡 Що дає: клас, який поводиться як
🧠 В чому суть
У PHP якщо ми зробимо зміни часу у обʼєкта
⚙️ Коли це справді має сенс
— у DTO / Value Object — щоб час гарантовано не змінювався після передачі;
— у планувальниках, розкладах, звітах — коли ти рахуєш багато дат від базової;
— у бізнес-логіці — коли з однієї дати обчислюється інша (початок/кінець періоду, дедлайн, акція, тощо).
⚙️ Проблема, яку можна не помітити
У продакшн-коді
І тут трапляється типова історія:
Ми очікували, що початок буде 1 жовтня, але
Той самий код, але з
🧱 Додатковий приклад
Жодних несподіваних мутацій — об’єкт можна безпечно кешувати чи передавати далі.
🧭 Висновок
🔥 Якщо твоя дата здатна змінитись — вона рано чи пізно зламає щось у звіті, логіці або фінансах.
———
⬅️ Генератори | Іменовані аргументи ➡️
🚀 Чи знаєш ти, що PHP так вміє? 5/10
⏳ DateTimeImmutable
🧊 Коли час змінюється, а обʼєкти ні
📦 Додано у версії: PHP 5.5
💡 Що дає: клас, який поводиться як
DateTime, але не змінюється при модифікації, а повертає клонований обʼєкт. 🧠 В чому суть
У PHP якщо ми зробимо зміни часу у обʼєкта
DateTime, він змінився всюди, де передавався, бо обʼєкти в PHP завжди передаються по посиланню, і така поведінка може призвести до неочікуваної поведінки.DateTimeImmutable вирішує цю проблему — будь-яка дія над датою повертає новий екземпляр, а не мутує старий.⚙️ Коли це справді має сенс
— у DTO / Value Object — щоб час гарантовано не змінювався після передачі;
— у планувальниках, розкладах, звітах — коли ти рахуєш багато дат від базової;
— у бізнес-логіці — коли з однієї дати обчислюється інша (початок/кінець періоду, дедлайн, акція, тощо).
⚙️ Проблема, яку можна не помітити
У продакшн-коді
DateTime часто передають між сервісами, DTO або кэшують у контейнерах.І тут трапляється типова історія:
class Campaign {
public function __construct(
public string $name,
public DateTime $startsAt,
public DateTime $endsAt,
) {}
}
$base = new DateTime('2025-10-01');
$campaign = new Campaign(
name: 'Autumn Sale',
startsAt: $base,
endsAt: $base->modify('+7 days')
);
echo $campaign->startsAt->format('Y-m-d'); // 2025-10-08 ❌
echo $campaign->endsAt->format('Y-m-d'); // 2025-10-08Ми очікували, що початок буде 1 жовтня, але
$base мутував під час modify, як наслідок — початок і кінець однакові.Той самий код, але з
DateTimeImmutable працює корректно$base = new DateTimeImmutable('2025-10-01');
$campaign = new Campaign(
name: 'Autumn Sale',
startsAt: $base,
endsAt: $base->modify('+7 days')
);
echo $campaign->startsAt->format('Y-m-d'); // 2025-10-01 ✅
echo $campaign->endsAt->format('Y-m-d'); // 2025-10-08🧱 Додатковий приклад
class Period {
public function __construct(
public DateTimeImmutable $from,
public DateTimeImmutable $to
) {}
public function days(): int {
return $this->to->diff($this->from)->days;
}
}
$period = new Period(
from: $from = new DateTimeImmutable('2025-06-01'),
to: $from->modify('+10 days'),
);
echo $period->days(); // 10Жодних несподіваних мутацій — об’єкт можна безпечно кешувати чи передавати далі.
🧭 Висновок
DateTimeImmutable — це безпечний вибір для роботи з логікою часу.
Він виключає випадкові зміни дат, коли одна змінна призводить до неочікуваних результатів.
🔥 Якщо твоя дата здатна змінитись — вона рано чи пізно зламає щось у звіті, логіці або фінансах.
Immutable цього не дозволить.———
⬅️ Генератори | Іменовані аргументи ➡️
👍7🤝2