Глоссарий
Словарь веб-разработчика
Визначення технічних термінів з 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-запросы без индексов.