#course #php #php8_5 #talks #4students
А хіба current() та end() вже не справляються❓
На одній з персональних консультацій ми з одним з підписників обговорювали статтю про нововведення в PHP 8.5, зокрема появу функцій
У нього виникло питання:
І раптом я подумав, що це питання може виникнути не тільки в нього, бо може здатися, що
Тому я вирішив написати короткий пост, щоб розкласти все по поличках 👇
Функції
Тобто функція
Концептуальний приклад:
Ми хочемо вивести всі елементи масиву, якщо останній елемент не "d"
Але на екран виведеться тильки 'c'
✅
Нові функції будуть завжди повертати перше або останнє значення без побічних ефектів.
Вони не змінюють стан вказівника і не залежать від нього:
📌 PHP продовжує розвиватися в бік декларативного і безпечного коду, і ці нові функції — це не "зайве", а ще один крок до меншої кількості багів.
Якщо помітили у себе в коді
А хіба current() та end() вже не справляються❓
На одній з персональних консультацій ми з одним з підписників обговорювали статтю про нововведення в PHP 8.5, зокрема появу функцій
array_first() та array_last().У нього виникло питання:
“А навіщо це потрібно, якщо є current() і end()?”
І раптом я подумав, що це питання може виникнути не тільки в нього, бо може здатися, що
current() та end() роблять те саме.Тому я вирішив написати короткий пост, щоб розкласти все по поличках 👇
Функції
current() справді повертає перший елемент, а end() останній елемент масиву, але тільки після того, як зрушують внутрішній вказівник масиву. Це означає, що:$array = ['a', 'b', 'c', 'd'];
echo current($array); // 'a'
echo next($array); // 'b'
echo current($array); // 'b', а не 'a'
echo end($array); // 'd'
echo current($array); // 'd' а не 'a'
Тобто функція
current() повертає не перший елемент масиву, а той, на який вказує вказівник, а end() останній елемент масиву, але при цьому переставляє на нього внутрішній вказівник масиву, що в свою чергу може привезти до непередбачуванних наслідків.Концептуальний приклад:
Ми хочемо вивести всі елементи масиву, якщо останній елемент не "d"
$array = ['a', 'b', 'c'];
if (end($array) !== 'd') { // але вказівник вже перемістився на 'c'
while ($item = current($array)) {
echo $item . PHP_EOL;
next($array);
}
}
Але на екран виведеться тильки 'c'
✅
array_first() та array_last() — декларативні та передбачуваніНові функції будуть завжди повертати перше або останнє значення без побічних ефектів.
Вони не змінюють стан вказівника і не залежать від нього:
$array = ['a', 'b', 'c'];
array_first($array); // 'a'
array_last($array); // 'c'
// Незалежно від вказівника
next($array);
array_first($array); // все ще 'a'
📌 PHP продовжує розвиватися в бік декларативного і безпечного коду, і ці нові функції — це не "зайве", а ще один крок до меншої кількості багів.
Якщо помітили у себе в коді
current() чи end() — можливо, час подивитись на них під новим кутом.SensioLabs
What's New in PHP 8.5: A Comprehensive Overview
PHP 8.5 will be released in November 2025 and brings several useful new features and improvements. This version focuses on developer experience enhancements, new utility functions, and better debug...
❤5👍4
#course #algorithm #series
🧵Наскільки ефективний мій код? 6/8
O(n³) – Кубічна складність
Тут вже все дуже серйозно. Алгоритми з O(n³) використовують три вкладені цикли. Це означає, що при зростанні розміру даних, час виконання збільшується в кубі.
📌 Приклад: Множення двох матриць
📊 Звучить академічно, але трапляється частіше, ніж здається: в обчисленнях, побудові графів, пошуку комбінацій. Усе, що потребує порівняння трійок даних або тривимірних структур — кандидати на O(n³).
⚠️ Це вже критична точка. Якщо можете уникнути такого коду — уникайте. Часто можна знайти способи звести це до O(n²) або навіть O(n log n).
⬅️ Попередня складність | Наступна складність ➡️
🧵Наскільки ефективний мій код? 6/8
O(n³) – Кубічна складність
Тут вже все дуже серйозно. Алгоритми з O(n³) використовують три вкладені цикли. Це означає, що при зростанні розміру даних, час виконання збільшується в кубі.
📌 Приклад: Множення двох матриць
function matrixMultiplication($matrixA, $matrixB) {
$rowsA = count($matrixA);
$colsA = count($matrixA[0]);
$colsB = count($matrixB[0]);
$result = [];
for ($i = 0; $i < $rowsA; $i++) {
for ($j = 0; $j < $colsB; $j++) {
$result[$i][$j] = 0;
for ($k = 0; $k < $colsA; $k++) {
$result[$i][$j] += $matrixA[$i][$k] * $matrixB[$k][$j];
}
}
}
return $result;
}📊 Звучить академічно, але трапляється частіше, ніж здається: в обчисленнях, побудові графів, пошуку комбінацій. Усе, що потребує порівняння трійок даних або тривимірних структур — кандидати на O(n³).
⚠️ Це вже критична точка. Якщо можете уникнути такого коду — уникайте. Часто можна знайти способи звести це до O(n²) або навіть O(n log n).
📌 Завтра поговоримо про O(2ⁿ) — експоненціальну складність. І це вже не жарти.
⬅️ Попередня складність | Наступна складність ➡️
🔥2👍1😁1
#question
Яке твердження про trait є хибним?
Яке твердження про trait є хибним?
Anonymous Quiz
9%
Можна перевизначити метод trait-а у класі.
11%
Trait може містити властивості.
28%
Trait можна комбінувати з use всередині іншого trait.
47%
Trait автоматично включається до кожного дочірнього класу.
6%
Метод із trait-а викликається як звичайний метод класу.
👍2🥱1
#game #dictionary34
☕️ Доброго ранку!
Сьогодні в нас нова ранкова активність — «Три-чотири» 🧠
Правила прості:
🔹поясни поняття в трьох, максимум чотирьох словах
🔹можна правильно, а можна смішно
🔹кількість коментарів не обмежена
🔹кожну версію пиши в окремому коментарі
💬 Відповідь, що набере більше всього вподобайок увійде до словника, який я буду збирати!
🎯 Поняття дня:
По одній з версій, це:
👇 Пиши свою версію в коментарях.
---
🇺🇦 Якщо ти в тилу, закинь свої 2 гривні на ЗСУ в будь-який фонд, якому довіряєш!
Допоможи нашому війську стати сильнішим 💪
☕️ Доброго ранку!
Сьогодні в нас нова ранкова активність — «Три-чотири» 🧠
Правила прості:
🔹поясни поняття в трьох, максимум чотирьох словах
🔹можна правильно, а можна смішно
🔹кількість коментарів не обмежена
🔹кожну версію пиши в окремому коментарі
💬 Відповідь, що набере більше всього вподобайок увійде до словника, який я буду збирати!
🎯 Поняття дня:
Легасі код
По одній з версій, це:
Неясно як, але працює
👇 Пиши свою версію в коментарях.
---
🇺🇦 Якщо ти в тилу, закинь свої 2 гривні на ЗСУ в будь-який фонд, якому довіряєш!
Допоможи нашому війську стати сильнішим 💪
👍1
#course #algorithm #series
🧵Наскільки ефективний мій код? 7/8
O(2ⁿ) – Експоненціальна складність
Це вже абсолютна прірва. Зі зростанням обсягу вхідних даних час виконання алгоритму росте дуже швидко. Подвоїли вхід — подвоїли час. І з кожним наступним збільшенням ситуація тільки погіршується.
📌 Приклад: Обчислення чисел Фібоначчі наївним рекурсивним методом
На перший погляд — все просто. Але з кожним викликом функція породжує два нових. І так далі, і далі… Пам’ятаєш кроликів 🐇 Фібоначчі? Ось вони, множаться як божевільні.
💡 У реальних проєктах рекурсивні алгоритми з експоненціальною складністю трапляються рідко, бо майже завжди є ефективніший підхід (динамічне програмування, кешування результатів).
⚠️ O(2ⁿ) — це червоний прапорець. Якщо ви бачите щось подібне у продакшені — час бити на сполох і шукати оптимізацію.
⬅️ Попередня складність | Наступна складність ➡️
🧵Наскільки ефективний мій код? 7/8
O(2ⁿ) – Експоненціальна складність
Це вже абсолютна прірва. Зі зростанням обсягу вхідних даних час виконання алгоритму росте дуже швидко. Подвоїли вхід — подвоїли час. І з кожним наступним збільшенням ситуація тільки погіршується.
📌 Приклад: Обчислення чисел Фібоначчі наївним рекурсивним методом
function naiveFibonacci($n) {
if ($n <= 1) return $n;
return naiveFibonacci($n - 1) + naiveFibonacci($n - 2);
}На перший погляд — все просто. Але з кожним викликом функція породжує два нових. І так далі, і далі… Пам’ятаєш кроликів 🐇 Фібоначчі? Ось вони, множаться як божевільні.
💡 У реальних проєктах рекурсивні алгоритми з експоненціальною складністю трапляються рідко, бо майже завжди є ефективніший підхід (динамічне програмування, кешування результатів).
⚠️ O(2ⁿ) — це червоний прапорець. Якщо ви бачите щось подібне у продакшені — час бити на сполох і шукати оптимізацію.
📌 Завтра поговоримо про фінальний босс: O(n!) — факторіальну складність. Таке не пробачається навіть тестових завданнях.
⬅️ Попередня складність | Наступна складність ➡️
#course #php #talks #4students #tips #tools
🧲 Один з інструментів DRY або єдиний дозволений copy/paste
Багато технічних співбесід показують, що розробники або не використовують трейти зовсім, або роблять це без розуміння практичного сенсу. Часто їх просто бояться — мовляв, поведінка трейту може бути неочевидною або ж спричинити баги, які складно відслідкувати.
Але суть в тому, що трейти — це всього лише інструмент, який треба застосовувати там, де від нього буде найбільше користі.
І найчастіше це не сервісні класи (хоча є ситуації коли і тут вони будуть доречні), а обʼєктні структури: сутності, DTO, VO, event'и тощо. Саме там трейти — ідеальний інструмент для роздачі типової поведінки без зайвої ієрархії і порушення
Гарний приклад — бібліотека knplabs/doctrine-behaviors. своїми інтерфейсами вона надає вашим сутностям типову поведінку (наприклад, Timestampable, SoftDeletable, Translatable тощо), але замість того, щоб реалізовувати інтерфейси в кожному класі, ви просто додаєте реалізацію — підключаючи відповідний трейт. Ніяких милиць у вигляді абстрактних батьківських класів, які «надають поведінку», тільки чистий код, лаконічний
Хоча справедливості заради варто визнати:
🎯 Висновок
PS:
🧠 Порада: як зробити, щоб трейт гарантовано працював в будь-якому класі без помилок?
Погано:
Добре:
🧲 Один з інструментів DRY або єдиний дозволений copy/paste
Багато технічних співбесід показують, що розробники або не використовують трейти зовсім, або роблять це без розуміння практичного сенсу. Часто їх просто бояться — мовляв, поведінка трейту може бути неочевидною або ж спричинити баги, які складно відслідкувати.
Але суть в тому, що трейти — це всього лише інструмент, який треба застосовувати там, де від нього буде найбільше користі.
І найчастіше це не сервісні класи (хоча є ситуації коли і тут вони будуть доречні), а обʼєктні структури: сутності, DTO, VO, event'и тощо. Саме там трейти — ідеальний інструмент для роздачі типової поведінки без зайвої ієрархії і порушення
DRY.Гарний приклад — бібліотека knplabs/doctrine-behaviors. своїми інтерфейсами вона надає вашим сутностям типову поведінку (наприклад, Timestampable, SoftDeletable, Translatable тощо), але замість того, щоб реалізовувати інтерфейси в кожному класі, ви просто додаєте реалізацію — підключаючи відповідний трейт. Ніяких милиць у вигляді абстрактних батьківських класів, які «надають поведінку», тільки чистий код, лаконічний
use TraitName і ніякого copy/pasteХоча справедливості заради варто визнати:
copy/paste все одно відбувається, просто не в коді, а на рівні інтерпретатора.🎯 Висновок
Трейти — це спосіб дотримуватися DRY і не лізти в спадкування там, де воно недоречне. Це дуже потужний інструмент якщо використовувати його правильно і там де треба.
PS:
🧠 Порада: як зробити, щоб трейт гарантовано працював в будь-якому класі без помилок?
❗️ Ніколи не звертайтесь всередині трейту до властивостей або методів класу, в який трейт підключено. Трейт не знає, куди його вставлять — і тому контекст будь-якого трейту має бути самообмеженим. Це головна умова, щоб ваш трейт працював стабільно і не викликав помилки.
Погано:
trait BadTrait {
public function generateUniqueId(): void
{
$this->id = uniqid();
}
}Добре:
trait GoodTrait {
protected string $id;
public function generateUniqueId(): void
{
$this->id = uniqid();
}
}👍8💩1
#game #dictionary34
☀️ Доброго ранку!
Граємо в «Три-чотири» 🧠
Правила тут
🎯 Поняття дня:
По одній з версій, це:
👇 Пиши свою версію в коментарях.
---
🇺🇦 Ранок без донату на ЗСУ — як request без response.
🎯 Закинь свої 2 гривні у return — підтримай наших захистників! 💛💙
☀️ Доброго ранку!
Граємо в «Три-чотири» 🧠
Правила тут
🎯 Поняття дня:
Middleware
По одній з версій, це:
Магія поза Гоґвортсом
👇 Пиши свою версію в коментарях.
---
🇺🇦 Ранок без донату на ЗСУ — як request без response.
🎯 Закинь свої 2 гривні у return — підтримай наших захистників! 💛💙
👍1
#course #algorithm #series
🧵Наскільки ефективний мій код? 8/8
O(n!) – Факторіальна складність
Це — вершина обчислювального кошмару. Факторіальна складність означає, що кількість операцій зростає як добуток усіх цілих чисел до n. Для n = 10 — це вже 3 628 800 варіантів. І так, усе це треба обробити.
📌 Приклад: Генерація всіх можливих перестановок елементів
Цей код генерує всі можливі перестановки елементів масиву. І якщо їх 8 — то вже 40 320 варіантів. Це може виглядати невинно, поки не впаде прод у Black Friday.
📌 Факторіальна складність — це завжди крайній захід. Якщо задача передбачає перебір усіх варіантів, спершу шукайте апроксимацію, жадібний алгоритм або евристику.
🎬 На цьому серія завершується.
Якщо хочете ще серію подібну до цієї, пишіть в коментарях або в особисті.
⬅️ Попередня складність
🧵Наскільки ефективний мій код? 8/8
O(n!) – Факторіальна складність
Це — вершина обчислювального кошмару. Факторіальна складність означає, що кількість операцій зростає як добуток усіх цілих чисел до n. Для n = 10 — це вже 3 628 800 варіантів. І так, усе це треба обробити.
10! = 10 × 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 3 628 800
📌 Приклад: Генерація всіх можливих перестановок елементів
function permutations(array $items): array {
if (count($items) <= 1) return [$items];
$result = [];
foreach ($items as $key => $item) {
$remaining = $items;
unset($remaining[$key]);
foreach (permutations(array_values($remaining)) as $perm) {
$result[] = array_merge([$item], $perm);
}
}
return $result;
}Цей код генерує всі можливі перестановки елементів масиву. І якщо їх 8 — то вже 40 320 варіантів. Це може виглядати невинно, поки не впаде прод у Black Friday.
📌 Факторіальна складність — це завжди крайній захід. Якщо задача передбачає перебір усіх варіантів, спершу шукайте апроксимацію, жадібний алгоритм або евристику.
🎬 На цьому серія завершується.
Якщо хочете ще серію подібну до цієї, пишіть в коментарях або в особисті.
⬅️ Попередня складність
👍8
This media is not supported in your browser
VIEW IN TELEGRAM
#humor
Коли йдеш за трендами і вирішив розробити свою ML модель але єдина мова, яку ти знаєш — це PHP
Коли йдеш за трендами і вирішив розробити свою ML модель але єдина мова, яку ти знаєш — це PHP
😁13
#game #dictionary34
🌥 Ранок!
Забув написати відкладений пост, тому трохи із затримкою граємо в «Три-чотири» 🧠 (правила)
🎯 Поняття дня:
По одній з версій, це:
👇 Пиши свою версію в коментарях.
---
🕯Задонать свої 47 гривень на ЗСУ, щоб люди не гинули увісні від кацапських шахедів, що залетають в багатоповерхівки.
🌥 Ранок!
Забув написати відкладений пост, тому трохи із затримкою граємо в «Три-чотири» 🧠 (правила)
🎯 Поняття дня:
Фреймворк
По одній з версій, це:
Батько твого контролера
👇 Пиши свою версію в коментарях.
---
🕯Задонать свої 47 гривень на ЗСУ, щоб люди не гинули увісні від кацапських шахедів, що залетають в багатоповерхівки.
❤2👍1
#game #dictionary34
🎂 Доброго ранку!
Граємо в «Три-чотири» 🧠 (правила)
🎯 Поняття дня:
По одній з версій:
👇 Пиши свою версію в коментарях.
---
Мені сьогодні 4⃣2⃣, тому, у якості привітання, зкиньте 42 гривні на русоріз або на інший збір, якому ви довіряєте.
🎂 Доброго ранку!
Граємо в «Три-чотири» 🧠 (правила)
🎯 Поняття дня:
Динамічна типізація
По одній з версій:
Тип змінюється як настрій
👇 Пиши свою версію в коментарях.
---
Мені сьогодні 4⃣2⃣, тому, у якості привітання, зкиньте 42 гривні на русоріз або на інший збір, якому ви довіряєте.
👍5🎉3❤1
#game #dictionary34
🌄 Доброго ранку!
Після змушеної переви, продовжую
Граємо в «Три-чотири» 🧠 (правила)
🎯 Поняття дня:
По одній з версій:
👇 Напиши свою смішну або правильну версію в коментарях.
---
🎯 Кожна твоя думка в коментарях — це плюс у словник, а кожен донат — плюс до нашої Перемоги. Підтримай ЗСУ!
🌄 Доброго ранку!
Після змушеної переви, продовжую
Граємо в «Три-чотири» 🧠 (правила)
🎯 Поняття дня:
Лямбда функція
По одній з версій:
Виконавець для колбеків
👇 Напиши свою смішну або правильну версію в коментарях.
---
🎯 Кожна твоя думка в коментарях — це плюс у словник, а кожен донат — плюс до нашої Перемоги. Підтримай ЗСУ!
❤2
#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