Глоссарий

Словарь веб-разработчика

Визначення технічних термінів з 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 — может содержать реализацию; класс наследует только один