Коли змінні повинні бути `null`, `false`, невизначеними або порожнім рядком у PHP?

pic

Рівень поганого коду 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 змішує типи даних без потреби.

pic

Кращі практики

1.
Приведення значень до їхнього наміру

  • Використовуйте null для відсутності значення, false для булевих значень, і порожні рядки для рядків, що не містять символів.
$userEmail = null; // Електронна пошта не надана  
$isVerified = false; // Користувач не перевірений  
$comments = ""; // Коментарі ще не надані
  1. Значення за замовчуванням Завжди надавайте змінним значення за замовчуванням, які відповідають очікуваному типу.
$score = null; // Цілі числа можуть бути надані пізніше  
$isAuthenticated = false; // Почати з булевого значення за замовчуванням  
$name = ""; // Порожній рядок як значення за замовчуванням для тексту
  1. Строга порівняння Уникайте непотрібних перетворень за допомогою === та !==.
if ($variable === null) {  
 echo "Змінна дорівнює null";  
}  
if ($isLoggedIn === false) {  
 echo "Користувач не авторизований.";  
}
  1. Використовуйте підказки типів і об'єднані типи 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?

Leave a Reply

Your email address will not be published. Required fields are marked *