Глоссарий

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

Визначення технічних термінів з PHP, DevOps, MySQL та AI — з прикладами коду та поясненнями простою мовою.

228 терминов
46 букв
П
Пагинация
Пагинация — разбиение большого набора данных на страницы для передачи клиенту частями. Возвращать 100 000 строк одним запросом — катастрофа для памяти и сети. Пагинация решает это.Два подходаOffset / Limit — SELECT ... LIMIT 20 OFFSET 200. Прост, но замедляется на больших офсетах: БД всё равно сканирует часть таблицы, чтобы пропустить первые 200 строкCursor-based (Keyset) — WHERE id > {last_id} LIMIT 20. Стабильная скорость независимо от глубины пагинации. Рекомендуемый подход для больших таблиц и real-time feedsОтвет APIВозвращайте метаданные вместе с данными: текущая страница, всего элементов, ссылки на следующую/предыдущую. Для cursor-based — токен следующего курсора.{ "data": [...], "meta": { "total": 1240, "per_page": 20, "next_cursor": "abc123" } }
Передача по ссылке (&)
В PHP переменные по умолчанию передаются по значению: функция получает копию. При передаче по ссылке (&$var) функция работает с оригинальной переменной. Пример function addTen(int $n): void { $n += 10; // меняет только локальную копию } function addTenRef(int &$n): void { $n += 10; // меняет оригинал } $x = 5; addTen($x); // $x = 5 addTenRef($x); // $x = 15 Объекты — особый случай Объекты в PHP передаются по handle (указатель на объект), а не по значению и не по ссылке. Изменение свойств объекта внутри функции видно снаружи. Но $obj = new OtherClass() — не видно (заменяет локальный handle). Когда использовать Редко нужно в современном коде. Лучше возвращать новое значение из функции, а не мутировать аргумент. Оправдано для sort()-подобных функций или больших структур для избежания копирования.
Переменные среды (.env)
Переменные среды — конфигурация вне кода: пароли, ключи API, URL базы данных. Хранятся в среде ОС или файле .env. Код читает их в runtime, а не хардкодит прямо в исходниках.Почему отдельно от кодаОдна кодовая база — много окружений (local / staging / production) с разными значениями.env не попадает в Git (есть в .gitignore) — секреты не утекаютУдобная замена конфигурации без изменения кода и пересборкиПрактикаДержите в репозитории .env.example со всеми ключами, но без значений — новые разработчики будут знать, что настраивать. В CI/CD инжектируйте переменные через UI провайдера, не через файлы.12-Factor AppХранение конфигурации в переменных среды — один из принципов 12-Factor App — методологии построения масштабируемых облачных приложений.
Перечисление (Enum)
Enum (перечисление) — тип данных с фиксированным набором именованных констант. Вместо «магических» строк 'published', 'draft' в коде — тип с компиляторной проверкой. PHP поддерживает enums с версии 8.1.Backed Enum (с типом)enum Status: string { case Draft = 'draft'; case Published = 'published'; case Archived = 'archived'; } $post->status = Status::Published; echo Status::Published->value; // "published" $s = Status::from('draft'); // Status::DraftPure Enum (без типа)enum Direction { case North; case South; case East; case West; }ПреимуществаIDE-автодополнение и статический анализ знают все возможные значенияНевозможно передать несуществующее значениеEnum может реализовывать интерфейсы и иметь методы
Позднее статическое связывание (LSB)
Late Static Binding — механизм PHP, позволяющий статическим методам ссылаться на класс, с которого они были вызваны, а не на класс, где определены. static:: вместо self::. Разница self vs static class Base { public static function create(): static { return new static(); // класс, на котором вызвали } public static function name(): string { return static::class; // Late Static Binding } } class Child extends Base {} Child::create(); // возвращает Child, не Base Child::name(); // "Child", не "Base" Где используется Fluent interfaces и Builder-паттерны, возвращающие static ActiveRecord-стиль: User::find(1) возвращает User, а не базовый класс Статические фабричные методы в иерархиях
Полиморфизм
Полиморфизм — способность объектов разных классов реагировать на одинаковый вызов метода по-разному. Код, обращающийся к методу через интерфейс или родительский класс, не знает и не должен знать, какой именно подкласс выполнит логику. Пример interface Shape { area(): float; } class Circle implements Shape { area(): float { return M_PI * $this->r ** 2; } } class Square implements Shape { area(): float { return $this->side ** 2; } } function printArea(Shape $s): void { echo $s->area(); // не знает, круг или квадрат } Два типа Compile-time (статический) — перегрузка методов (overloading). В PHP ограничено: нет настоящего overloading, но есть variadic arguments Runtime (динамический) — переопределение методов (overriding) через наследование или интерфейсы. Наиболее распространён в PHP
Полнотекстовый поиск
Полнотекстовый поиск — поиск по естественному тексту с поддержкой релевантности, морфологии, стоп-слов и ранжирования результатов. Отличается от LIKE-поиска: LIKE '%php%' не учитывает морфологию и не ранжирует; полнотекстовый поиск — учитывает.MySQL FULLTEXTMySQL поддерживает FULLTEXT-индекс для MyISAM и InnoDB. Два режима: BOOLEAN (операторы +, -, *) и NATURAL LANGUAGE (ранжирование по релевантности).MATCH(title, body) AGAINST('opcache php' IN BOOLEAN MODE)Elasticsearch и OpenSearchДля серьёзного поиска — специализированные движки на базе Lucene. Поддерживают stemming (морфология), faceted search, синонимы, typo-tolerance, geo-search. Данные синхронизируются с основной БД через события.
Приведение типов (Type Juggling)
Type Juggling — неявная автоматическая конвертация типов в PHP при операциях между разными типами. PHP — язык с динамической типизацией: "5" + 3 = 8 (строка становится числом). Удобно, но является источником тонких багов. Классические ловушки // Нестрогое сравнение == 0 == "foo" // true (до PHP 8: "foo" → 0) 0 == "" // true (до PHP 8) "1" == "01" // true 100 == "1e2" // true null == false // true // PHP 8 исправил: нечисловые строки сравниваются как строки 0 == "foo" // false в PHP 8+ Правило Всегда используйте строгое сравнение === и !== — оно проверяет и тип, и значение. Включайте declare(strict_types=1). var_dump vs print_r var_dump() показывает тип и значение — незаменим при отладке проблем с типами.
Проблема N+1
Проблема N+1 — антипаттерн, при котором для отображения N записей выполняется N+1 SQL-запрос: один для получения списка и по одному для каждой связанной записи. На 100 записях — 101 запрос; на 1000 — 1001.Как возникаетORM загружает список объектов. Затем в цикле для каждого объекта обращается к связанному — и ORM тихо выполняет отдельный SELECT. Каждое обращение выглядит безобидно, но вместе они убивают производительность.Решение: Eager LoadingВместо отдельных запросов в цикле — один дополнительный запрос с WHERE id IN (...) для всех связанных записей сразу. Результат: всегда 2 запроса независимо от числа записей. В большинстве ORM это управляется методами типа include, with, joins или preload.ДиагностикаВключите логирование SQL-запросов и обратите внимание, если однотипные SELECT-ы повторяются десятки раз. Количество запросов, пропорциональное числу строк на странице — верный признак N+1.
Пространство имён (Namespace)
Namespace — механизм организации кода, позволяющий избегать конфликтов имён между классами, функциями и константами. Как папки на диске: два файла Logger.php могут мирно сосуществовать в разных директориях.Объявление и использованиеnamespace App\Services; class UserService { ... } // В другом файле: use App\Services\UserService; $service = new UserService();PSR-4 и autoloadingСтандарт PSR-4 связывает namespace со структурой директорий: App\Services\UserService → app/Services/UserService.php. Composer автоматически подгружает файл при первом обращении к классу — без ручных require.
Профилирование (Profiling)
Профилирование — измерение того, сколько времени и памяти тратит каждая часть программы. Позволяет найти реальные «узкие места» вместо оптимизации наугад. Принцип: сначала измерь, потом оптимизируй.Типы профилированияCPU profiling — какая функция занимает больше всего времени выполненияMemory profiling — что потребляет больше всего памяти, где утечкиI/O profiling — медленные SQL-запросы, сетевые вызовыИнструментыPHP: Xdebug + KCacheGrind, Blackfire, TidewaysNode.js: Chrome DevTools CPU профайлер, clinic.jsPython: cProfile, py-spy, memory_profilerПравило 80/20Обычно 20% кода занимает 80% времени выполнения. Профайлер покажет эти 20%. Чаще всего узким местом оказываются не код приложения, а SQL-запросы без индексов.