Глосарій
Словник веб-розробника
Визначення технічних термінів з PHP, DevOps, MySQL та AI — з прикладами коду та поясненнями простою мовою.
228
термінів
47
літер
І
Ідемпотентність
Ідемпотентна операція — та, яку можна виконати кілька разів, і результат буде той самий, що й після першого виконання. Критично важлива в API і чергах, де запит може бути повторений через мережеву помилку.В HTTPІдемпотентні: GET, PUT, DELETE, HEAD — можна повторювати безпечноНе ідемпотентний: POST — кожен виклик створює новий ресурсIdempotency KeyДля POST-запитів клієнт генерує унікальний ключ (Idempotency-Key: uuid) і надсилає його в заголовку. Сервер зберігає результат за цим ключем: якщо прийде повторний запит — поверне збережений результат без повторної обробки. Stripe, Twilio та інші платіжні API вимагають цього.В чергахВоркер повинен бути готовий отримати одне і те саме повідомлення двічі (at-least-once delivery). Зберігайте оброблені ID і перевіряйте перед обробкою.
Іменовані аргументи (PHP 8)
Іменовані аргументи — PHP 8.0 дозволяє передавати аргументи за ім'ям параметра, а не за позицією. Прибирають необхідність пам'ятати порядок, дозволяють пропускати необов'язкові параметри.
Приклад
// Позиційний — потрібно пам'ятати порядок
array_slice($array, 0, 5, true);
// Іменований — зрозуміло без документації
array_slice(
array: $array,
offset: 0,
length: 5,
preserve_keys: true,
);
// Можна пропускати параметри зі значенням за замовчуванням
function createUser(
string $name,
string $role = 'user',
bool $active = true
) {}
createUser(name: 'Alice', active: false); // role = 'user' за замовч.
Обмеження
Не можна передати іменований аргумент перед позиційним. Іменовані аргументи у variadic-функціях перетворюються на асоціативний масив.
Інвалідація кешу
Інвалідація кешу — процес оголошення закешованих даних застарілими і їх видалення або оновлення. Це одна з найскладніших проблем у програмуванні: кешовані дані можуть «протухнути», але ви не завжди знаєте коли.СтратегіїTTL (Time To Live) — кеш живе N секунд, потім автоматично видаляється. Просто, але дані можуть бути застарілими до закінчення TTLEvent-based — при зміні даних явно видаляємо або оновлюємо відповідний кеш. Точно, але складніше реалізуватиWrite-through — запис одночасно в кеш і в БД. Завжди свіжий кеш ціною додаткового записуCache-aside — читаємо з кешу; якщо немає — читаємо з БД і кешуємо. Найпоширеніша стратегіяСкладністьПроблеми: cache stampede (багато запитів одночасно потрапляють у БД після закінчення TTL), stale reads (читання застарілих даних), складна інвалідація при зв'язаних даних.
Індекс (MySQL)
Індекс в MySQL — окрема структура даних (зазвичай B-Tree), яка дозволяє знаходити рядки без сканування всієї таблиці. Правильні індекси — найшвидший спосіб прискорити повільні запити, іноді в сотні разів.Коли індекс допомагаєКолонки у WHERE, JOIN ON, ORDER BY, GROUP BYКолонки з високою кардинальністю (багато унікальних значень) — ідеально для email, uuidКоли індекс шкодитьТаблиці з частими INSERT/UPDATE/DELETE — кожна зміна оновлює індексКолонки з низькою кардинальністю (boolean, status з 3 значень) — MySQL може вибрати full scan замість індексуСкладові індексиІндекс (a, b, c) використовується зліва направо: запит з WHERE a = 1 AND b = 2 використає індекс, а WHERE b = 2 — ні. Правило лівого префіксу.
Інкапсуляція
Інкапсуляція — приховування внутрішніх деталей реалізації об'єкта і надання контрольованого доступу до них через публічний інтерфейс. Зовнішній код знає лише «що» робить об'єкт, але не «як».
Модифікатори доступу
public — доступно звідусіль
protected — лише в класі та підкласах
private — лише в класі (найсуворіший)
readonly (PHP 8.1+) — записати можна лише в конструкторі
Навіщо
Клас може змінити внутрішню реалізацію без впливу на зовнішній код. Приклад: змінили зберігання балансу з int на Money VO — зовнішній код не знає про це, бо звертається тільки до getBalance().
Геттери та сеттери
Не обов'язкові — це деталь реалізації. Дублювати поле $name геттером getName() без причини — порушення DRY. Відкривайте лише те, що справді потрібно зовні.
Інтеграційне тестування
Інтеграційні тести перевіряють, що кілька компонентів коректно взаємодіють разом: сервіс + реальна БД, контролер + справжній HTTP-запит. На відміну від unit-тестів, не ізолюють залежності — перевіряють реальну інтеграцію.Де unit-тест не достатнійUnit-тест перевірив, що метод save() викликається. Але чи правильно налаштований маппінг до БД? Чи спрацьовує foreign key? Чи правильний SQL? Тільки інтеграційний тест відповість на ці питання.Піраміда тестуванняUnit (багато, швидкі) → Integration (менше, повільніші) → E2E (мало, повільні). Більшість помилок знаходить unit, але деякі — лише інтеграційний.ПрактикаТестова БД або in-memory (SQLite) — не забруднювати продакшн-даніТранзакції з rollback після кожного тесту — ізоляція між тестамиHTTP-тести через тестовий HTTP-клієнт — без реального сервера
Інтернаціоналізація (i18n) і Локалізація (l10n)
i18n (internationalization, 18 букв між i і n) — проєктування застосунку так, щоб він міг підтримувати різні мови і регіони без зміни коду. l10n (localization) — адаптація під конкретний регіон: переклади, формати дат, чисел, валют.
Що включає i18n
Виведення тексту через функції перекладу (__(), t()), а не хардкод рядків
Підтримка Unicode (UTF-8) по всьому стеку
Правильна обробка множини (1 файл / 2 файли / 5 файлів)
RTL (right-to-left) для арабської, єврейської
Формати дати/часу, чисел, валют через Intl API або locale-aware бібліотеки
l10n на практиці
// PHP — через ICU-формат (рекомендовано)
$msg = (new MessageFormatter('uk', '{count, plural,
one {# файл}
few {# файли}
many {# файлів}
other {# файла}
}'))->format(['count' => $n]);
Поширені помилки
Конкатенація рядків перекладу (порядок слів у мовах різний)
Ігнорування plurality rules
Хардкод форматів дат у вигляді d/m/Y
Інтерфейс (Interface)
Інтерфейс — контракт, який описує, що клас повинен вміти робити, але не як. Клас, що реалізує інтерфейс, зобов'язаний реалізувати всі його методи. Інтерфейс не має реалізації — лише сигнатури.Навіщо потрібенІнтерфейс дозволяє писати код, який залежить від абстракції, а не від конкретного класу. Можна підставити будь-яку реалізацію, яка відповідає контракту. Це основа Dependency Injection і тестування.Прикладinterface Logger {
public function log(string $message): void;
}
class FileLogger implements Logger { ... }
class NullLogger implements Logger { ... }Interface vs Abstract ClassInterface — лише сигнатури, клас може реалізовувати кілька інтерфейсівAbstract class — може містити реалізацію, клас успадковує лише один