Глоссарий
Словарь веб-разработчика
Визначення технічних термінів з PHP, DevOps, MySQL та AI — з прикладами коду та поясненнями простою мовою.
228
терминов
46
букв
И
Идемпотентность
Идемпотентная операция — та, которую можно выполнить несколько раз, и результат будет таким же, как после первого выполнения. Критически важна в 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('ru', '{count, plural,
one {# файл}
few {# файла}
many {# файлов}
other {# файла}
}'))->format(['count' => $n]);
Распространённые ошибки
Конкатенация строк перевода (порядок слов в языках разный)
Игнорирование правил множественного числа
Хардкод форматов дат вида 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 — может содержать реализацию; класс наследует только один