Глосарій
Словник веб-розробника
Визначення технічних термінів з PHP, DevOps, MySQL та AI — з прикладами коду та поясненнями простою мовою.
228
термінів
47
літер
П
Пагінація
Пагінація — розбиття великого набору даних на сторінки для передачі клієнту частинами. Повертати 100 000 рядків одним запитом — катастрофа для пам'яті і мережі. Пагінація вирішує це.Два підходиOffset / Limit — SELECT ... LIMIT 20 OFFSET 200. Простий, але повільніє на великих офсетах: БД все одно скануєчастину таблиці, щоб пропустити перші 200 рядківCursor-based (Keyset) — WHERE id > {last_id} LIMIT 20. Стабільна швидкість незалежно від глибини пагінації. Рекомендований підхід для великих таблиць і real-time feedsAPI-відповідьПоверніть метадані разом з даними: поточна сторінка, всього елементів, посилання на наступну/попередню. Для 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()-подібних функцій або великих структур для уникнення копіювання.
Перерахування (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 може реалізовувати інтерфейси та мати методи
Повнотекстовий пошук
Повнотекстовий пошук — пошук по природньому тексту з підтримкою релевантності, морфології, стоп-слів і ранжування результатів. Відрізняється від 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. Дані синхронізуються з основною БД через події.
Поліморфізм
Поліморфізм — здатність об'єктів різних класів реагувати на один і той самий виклик методу по-різному. Код, що звертається до методу через інтерфейс або батьківський клас, не знає і не має знати, який саме підклас виконає логіку.
Приклад
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
Приведення типів (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_profiler80/20 правилоЗазвичай 20% коду займає 80% часу виконання. Профайлер покаже ці 20%. Найчастіше вузьким місцем виявляється не PHP-код, а SQL-запити без індексів.
Пізнє статичне зв'язування (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, а не базовий клас
Статичні фабричні методи в ієрархіях