Рівень поганого коду 1000+
Напевно, ви це вже переживали. Ви переглядаєте запит на злиття (pull request) або копаєте в старому коді, і ось воно: if ($var == "not set")
, або if ($data == "")
, де повинні були використовуватись null
або false
. Такі невідповідності у станах змінних можуть швидко перетворити чисту кодову базу на заплутану купу неясностей та багів.
Я стикався з такими ситуаціями стільки разів, що відчув необхідність написати цю статтю як посібник для всіх, хто коли-небудь задавався питанням: "Яка різниця між цими значеннями? І коли треба використовувати кожне з них?" Давайте розберемося, щоб уникати таких помилок і писати чистіший, більш послідовний PHP-код.
Розуміння основ
Null
У PHP, null
означає, що змінна не має значення — вона порожня, нічого не містить. Це як сказати: "Я знаю, що це існує, але тут нічого немає".
$variable = null;
Використовуйте null
, коли:
- Ви хочете явно очистити змінну.
- Значення недоступне, але змінна повинна існувати в контексті вашої програми.
False
false
— це булеве значення, яке говорить: "Ні! Не станеться."
$isLoggedIn = false;
Використовуйте false
, коли:
- Умова або стан має негативний результат.
- Потрібно позначити невдачу в булевому контексті (наприклад, повернення
false
з функції).
Undefined
У PHP "невизначене" значення не існує так, як у JavaScript. Замість цього, доступ до неоголошеної змінної викликає попередження. Однак наявність невизначеної змінної може бути допустимою в деяких випадках — немає потреби ініціалізувати змінні лише заради цього.
Наприклад, ось таке надмірно обережне ініціалізування:
function processData() {
$data = false; // НАВІЩО? Це не потрібно, якщо змінна не використовується пізніше
if (someCondition()) {
$data = fetchData();
}
// Обробляти $data тільки, якщо вона встановлена
}
Замість цього використовуйте isset
або перевіряйте наявність змінної, коли це потрібно:
function processData() {
if (someCondition()) {
$data = fetchData();
}
if (isset($data)) {
// Обробляти $data тільки, якщо вона існує
}
}
Легітимні ситуації для невизначених змінних:
- Коли існування змінної залежить від умови.
- Коли її ініціалізація створює непотрібний безлад чи значення за замовчуванням.
Порожній рядок
Порожній рядок ""
— це рядок без символів, не null
, не false
, просто... порожній.
$username = "";
Використовуйте порожній рядок, коли:
- Змінна має бути рядком, але поки що не має значення.
- Ви скидаєте значення рядкової змінної, не змінюючи її типу.
Загальні помилки та їхні наслідки
Невірне використання null
замість false
$isAdmin = null; // НЕПРАВИЛЬНО
$isAdmin = false; // ПРАВИЛЬНО
Чому? null
означає відсутність значення, тоді як false
чітко каже: "Це не правда."
Невірне використання порожнього рядка замість null
$description = ""; // НЕПРАВИЛЬНО, якщо опис справді відсутній
$description = null; // ПРАВИЛЬНО
Чому? Порожній рядок вказує, що опис існує, але порожній. Використовуйте null
, якщо опис взагалі не існує.
Перевірка на порожній рядок замість false
$hasAccess = ""; // НЕПРАВИЛЬНО
$hasAccess = false; // ПРАВИЛЬНО
if ($hasAccess === "") {
echo "No access."; // ЗАПЛУТАНО
}
if ($hasAccess === false) {
echo "No access."; // ЧІТКО
}
Чому? Булеве значення краще передає намір у випадках контролю доступу або логічних перевірок.
Використання нестандартних рядків для стану
$status = "not set"; // НЕПРАВИЛЬНО
$status = null; // ПРАВИЛЬНО
Чому? Використання довільних рядків для позначення стану робить код важким для розуміння і схильним до помилок через друкарські помилки або невідповідності.
Невірне використання false
замість порожнього рядка
$username = false; // НЕПРАВИЛЬНО
$username = ""; // ПРАВИЛЬНО
Чому? Ім’я користувача повинно завжди бути рядком, навіть якщо воно порожнє. Використання false
змішує типи даних без потреби.
Кращі практики
1.
Приведення значень до їхнього наміру
- Використовуйте
null
для відсутності значення,false
для булевих значень, і порожні рядки для рядків, що не містять символів.
$userEmail = null; // Електронна пошта не надана
$isVerified = false; // Користувач не перевірений
$comments = ""; // Коментарі ще не надані
- Значення за замовчуванням Завжди надавайте змінним значення за замовчуванням, які відповідають очікуваному типу.
$score = null; // Цілі числа можуть бути надані пізніше
$isAuthenticated = false; // Почати з булевого значення за замовчуванням
$name = ""; // Порожній рядок як значення за замовчуванням для тексту
- Строга порівняння Уникайте непотрібних перетворень за допомогою
===
та!==
.
if ($variable === null) {
echo "Змінна дорівнює null";
}
if ($isLoggedIn === false) {
echo "Користувач не авторизований.";
}
- Використовуйте підказки типів і об'єднані типи PHP 8.0+ підтримує об'єднані типи та типи, які можуть бути null. Використовуйте їх для забезпечення правильних значень.
function setPrice(?float $price): void {
if ($price === null) {
echo "Ціна не доступна";
} else {
echo "Ціна: $price";
}
}
Реальні приклади
Приклад 1: Авторизація користувача
class User {
private ?string $email = null; // Електронна пошта може бути не завжди вказана
private bool $isVerified = false; // За замовчуванням користувач не перевірений
public function setEmail(?string $email): void {
$this->email = $email;
}
public function verify(): void {
$this->isVerified = true;
}
public function getStatus(): string {
if ($this->email === null) {
return "Електронна пошта не надана.";
}
return $this->isVerified ? "Перевірено" : "Не перевірено";
}
}
Приклад 2: Обробка форм
$formData = [
'username' => "",
'password' => null,
'remember_me' => false,
];
if ($formData['password'] === null) {
echo "Пароль обов'язковий.";
}
if ($formData['username'] === "") {
echo "Ім'я користувача не може бути порожнім.";
}
if ($formData['remember_me'] === false) {
echo "Користувач вибрав, щоб його не запам'ятовували.";
}
Висновок
Правильне використання null
, false
, невизначених змінних та порожніх рядків у PHP — це не просто про те, щоб код працював, але й про те, щоб код мав сенс. Відповідність значень їхньому наміру і уникання зайвих перетворень допоможе вам і вашій команді уникнути безлічі проблем. Пам'ятайте, чистий і послідовний код — це не лише хороша практика, але й збереження здорового глузду.
Перекладено з: When Should Variables Be Null, False, Undefined, or an Empty String in PHP?