**Примітка:** Ця стаття може бути дещо заплутаною для деяких початківців, оскільки вона передбачає базове розуміння 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
(число нуль), тому що вона переповнюється в нуль і вираз, таким чином, не є істинним.Рекомендую одне просте і ефективне рішення - запитувати кількість символів, які повертаються. Якщо рядок пустий (або змінна не існує), то повертається нуль символів і умова не виконується. Простий приклад:
$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:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | uk