Глосарій

Словник веб-розробника

Визначення технічних термінів з 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, а не базовий клас Статичні фабричні методи в ієрархіях