PHP Manual

Умови в PHP - IF() {...} - варіанти розгалуження

26. 11. 2019

Obsah článku

**Примітка:** Ця стаття може бути дещо заплутаною для деяких початківців, оскільки вона передбачає базове розуміння PHP. Якщо вам цікаво, як працюють умови, читайте про умови в курсі для початківців.

Підтримка: Всі версії: PHP 4, PHP 5, PHP 7
Короткий опис: Перевірка одного або декількох тверджень
Тип: Оператор, конструкція (не функція)

Опис

Часто потрібно визначити, чи виконується рівність або чи є твердження істинним, для цього і існують умови. PHP використовує наступний синтаксис, як і багато інших мов (особливо C):

if (/* логічне твердження */) {
// construct
}

Кожен логічний вираз має значення TRUE (істина) або FALSE (хибність), інших варіантів немає.

Приклад порівняння, чи є змінна $x більшою за змінну $y:

$x = 10;
$y = 5;
if ($x > $y) {
// Ця частина скрипту виконується, якщо умова істинна
} else {
// Ця частина скрипту буде виконуватись, якщо умова не виконується
}

Конструкція умови має обов'язковий вміст у круглих дужках, в якому наводиться вираз, що перевіряється, який складається з операторів (огляд нижче), декілька виразів можуть бути зв'язані за допомогою логічних операторів (огляд нижче).

Крім того, умова містить два необов'язкові блоки операторів.

  • Якщо виконується умова
  • Якщо умова не виконується

З практичних міркувань завжди включайте принаймні перший блок операторів, коли умова істинна, інакше тестування виразу не матиме сенсу.

Використання крапки з комою та дужок

Загалом:

  • Круглі дужки використовуються для відокремлення логічних виразів (інші круглі дужки можуть бути опущені для отримання більш складних виразів).
  • Дужка складна використовується для розмежування блоку команд і функцій.
  • Середина** використовується не для позначення умови (блок команд обмежується складеною дужкою), а для відокремлення окремих команд в межах умови).

Єдине можливе позначення з крапкою з комою (крім випадків використання конструкції endif):

if ($x > $y);

Однак така умова не має сенсу, оскільки в обох випадках результат порівняння буде відкинутий і жоден оператор, що належить до умови, не буде виконаний.

Альтернативні позначення

За певних обставин конструкція "якщо" може використовуватися з опущеними складеними дужками. Цього можна досягти лише у наступних випадках:

  • Якщо ми виконаємо тільки одне твердження в умові.
  • Якщо замість складних дужок використовувати двокрапку та ендіф;
  • Якщо використовувати "лінійну" нотацію.

Для більш детальної інформації див. наступні 3 розділи.

1. тільки одна команда ~ скорочений синтаксис

Якщо створюється умова, в якій потрібно виконати тільки одну конструкцію (оператор), то можна використовувати або класичний запис зі складними дужками, або класичний запис зі складними дужками:

if ($x > 10) { $y = $x; }

А можна дужки опустити:

if ($x > 10) $y = $x;

Однак така поведінка стосується лише однієї команди в безпосередній близькості від умови.

Кращий приклад (умовно виконується тільки конструкція $y = $x, решта виконується завжди):

$x = 5;
$y = 3;
$z = 10;
if ($x > $y)
$y = $x;
$x = 3;

2. Двокрапка та endif;

if (/* вираз */):
konstrukt;
konstrukt;
konstrukt;
endif;

Однак ця нотація вже давно вважається застарілою, оскільки знижує орієнтацію при зануренні декількох умов в самих себе.

Примітка: Хочу зазначити, що цей стиль подобається і деяким людям, наприклад, Юху (див. його статтю). Не дай Боже вам це десь використати.

3. Тернарний вираз ~ однорядковий "вбудований" запис

Іноді корисно виконати просте порівняння в рядку з якоюсь іншою дією (наприклад, разом з визначенням нової змінної). Якщо ми хочемо оформити лише одну заяву, то всю процедуру можна звести до одного рядка, навіть зберігши її максимально простою.

$x = 5;
$isBiggerThanTwo = ($x > 2 ? true : false);
// або навіть коротше:
$isBiggerThanTwo = ($x > 2);
// або без дужок:
$isBiggerThanTwo = $x > 2;

Операторські столи

В умові використовуються два типи операторів:

  • Порівняльні - порівнюють конкретні відносини,
  • Логічні** ~ об'єднують декілька виразів для створення складних умов.

Порівняльні оператори

Оператор "Значення
Дорівнює
===
Не дорівнює
Дорівнює або більше
Дорівнює або менше
Великий
Менше

Приклад (дійсний, коли $x не дорівнює 5):

if ($x != 5) { ... }

Логічні оператори

Оператор Альтернатива Значення Істина коли:
і одночасно обидва значення істинні
` ` АБО
XOR виключне АБО принаймні одне з них є істинним або хибним, але ніколи обидва разом
заперечення виразу "істина" при "хибності" і навпаки, не не *заперечення виразу "істина" при "хибності" і навпаки
() не заперечення виразу залежить від обставин

Більш складний приклад:

$x = 5;
$y = 3;
$z = 8;
if ($x > 0 && !($y != 2 && $z == $x) || $z > $y) { ... }

Опускання логічних операторів та операторів порівняння

Часто ми можемо дозволити собі опустити один з операторів (або навіть обидва), але ми ніколи не повинні забувати про правила правильного використання, щоб отриманий вираз працював.

У загальному випадку при перевірці виразу без оператора перевіряється, чи є його значення TRUE або непорожнім (наприклад, містить ненульове число, непорожній рядок, ...).

Приклади:

$x = 5;
$y = 3;
$z = 8;
if ($x) { ... } // проходить, тому що $x не пустий
if ($x && $y) { ... } // проходить, тому що $x та $y не пусті
if (!$x) { ... } // не вдається, тому що TRUE заперечується
if (isset($z)) { ... } // проходить, тому що змінна $z існує

Але каверзні ситуації можуть виникати, особливо коли:

  • Я прошу якщо ($x) і змінна $x містить нуль (0), то умова не виконується.
  • Або змінна $x містить рядок 0 (число нуль), тому що вона переповнюється в нуль і вираз, таким чином, не є істинним.
  • В умові є функція, яка завжди повертає деякий непорожній рядок, тому що тоді умова завжди істинна.
  • Або якщо ми перевіряємо ввід від користувача і він повертає "false" у вигляді рядка, то знову ж таки умова істинна, тому що рядок непорожній.

Рекомендую одне просте і ефективне рішення - запитувати кількість символів, які повертаються. Якщо рядок пустий (або змінна не існує), то повертається нуль символів і умова не виконується. Простий приклад:

$x = '0';
if ($x) { ... } // умова зазвичай не застосовується
if (strlen($x)) { ... } // умова є дійсною, оскільки $x містить 1 символ

Далі ми можемо перевірити існування змінної за допомогою функції isset().

Порівняння рядків

З'ясувати, що рядки ідентичні, нескладно:

$a = 'Кіт';
$b = 'кішка';
if ($a === $b) {
// Якщо рядки співпадають
} else {
// Якщо рядки різні
}

Важливо уважно стежити за типами даних на випадок, якщо запис може бути еквівалентним якомусь іншому.

Наприклад, порожній рядок $a = ''; відрізняється від рядка NULL: $b = NULL;. Це розмежування необхідно, наприклад, через бази даних, де є різниця між неіснуючим або порожнім значенням.

$a = '';
$b = null;
if ($a == $b) {
// Буде оцінено як TRUE, тому що
// відбувається перетворення типу даних.
}
if ($a === $b) {
// Виконує набагато більш сувору перевірку
// і він не пройде, бо він не такий, як усі.
// вміст та інший тип даних, тому
// цей код ніколи не виконається.
}

Також при порівнянні рядків варто ігнорувати білі (невидимі) символи, такі як пробіли, табуляції та переноси рядків. Це корисно, наприклад, при введенні пароля і передачі його функції хешування:

$password = '81dc9bdb52d04dc20036dbd8313ed055'; // 1234
$userPassword = '1234';
if (md5(trim($userPassword)) === $password) {
// Функція trim() автоматично видаляє пробіли.
}

Невідоме (неіснуюче) значення?

Іноді може статися так, що значення не існує (воно не є ні TRUE, ні FALSE), в основному це значення, отримане з бази даних (наприклад, ми запитуємо стовпець, якого не існує), в цьому випадку буде повернуто тип даних NULL.

У загальному випадку NULL оцінюється як FALSE, тобто умова не виконується. Однак така поведінка не завжди зручна, оскільки неіснуюче значення не обов'язково означає відсутність запису.

Приклад з практики: У нас є профіль користувача, і ми запитуємо веб-сторінку користувача. Не всім користувачам потрібно мати веб-сторінку, тому в цьому випадку повертається NULL, але користувач все одно існує. Тому в даному випадку краще використовувати функцію isset() для перевірки на (не)існування змінної, а не робити висновок на основі конкретного значення.

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
8.
Status:
All systems normal.
2024