Expressions

Оновлено: 11.05.2023

Вирази - це найважливіші будівельні блоки PHP. У PHP майже все, що ви пишете, є виразом. Найпростіший і водночас найточніший спосіб визначити вираз - це "все, що має значення".

Найпростішими формами виразів є константи і змінні. Коли ви вводите $a = 5, ви присвоюєте $a значення 5. 5, очевидно, має значення 5, або, іншими словами, 5 - це вираз зі значенням 5 (у цьому випадку 5 - це ціла константа).

Після цього присвоювання ви очікуєте, що значення $a також буде 5, тому якщо ви напишете $b = $a, ви очікуєте, що він буде поводитися так само, як якщо б ви написали $b = 5. Іншими словами, $a - це вираз зі значенням 5. Якщо все працює правильно, саме так і станеться.

Трохи складнішим прикладом для виразів є функції. Наприклад, розглянемо наступну функцію:

<?php
function foo ()
{
    return 5;
}
?>

Якщо ви знайомі з концепцією функцій (якщо ні, то перегляньте розділ про функції), ви можете припустити, що набрати $c = foo() - це все одно, що написати $c = 5, і ви маєте рацію. Функції - це вирази зі значенням, яке вони повертають. Оскільки foo() повертає 5, значенням виразу 'foo()' є 5. Зазвичай функції не просто повертають статичне значення, а щось обчислюють.

Звичайно, значення в PHP не обов'язково повинні бути цілими, і дуже часто вони не є такими. PHP підтримує чотири типи скалярних значень: значення типу int, значення з плаваючою комою (float), значення типу string і значення типу bool (скалярні значення - це значення, які ви не можете "розбити" на менші частини, на відміну від масивів, наприклад). PHP також підтримує два складені (нескалярні) типи: масиви та об'єкти. Кожен з цих типів значень можна присвоювати змінним або повертати з функцій.

PHP розвиває вирази набагато далі, так само, як і багато інших мов. PHP - це мова, орієнтована на вирази, в тому сенсі, що майже все в ній є виразом. Розглянемо приклад, який ми вже розглядали, $a = 5. Легко помітити, що тут беруть участь два значення, значення цілої константи 5 і значення $a, яке також оновлюється до 5. Але правда полягає в тому, що тут задіяно ще одне додаткове значення, і це значення самого присвоювання. Саме присвоювання обчислюється до присвоєного значення, у цьому випадку 5. На практиці це означає, що $a = 5, незалежно від того, що він робить, є виразом зі значенням 5. Таким чином, написати щось на кшталт $b = ($a = 5) - це все одно, що написати $a = 5; $b = 5; (крапка з комою позначає кінець виразу). Оскільки присвоювання розбираються в порядку справа наліво, ви також можете написати $b = $a = 5.

Іншим гарним прикладом орієнтації виразів є пре- і пост-інкремент і декремент. Користувачі PHP і багатьох інших мов можуть бути знайомі з позначеннями змінної++ і змінної--. Це оператори інкременту і декременту. У PHP, як і в C, існує два типи інкременту - преінкремент і постінкремент. І пре-інкремент, і пост-інкремент по суті збільшують змінну, і їх вплив на змінну ідентичний. Різниця полягає у значенні виразу інкременту. Преінкремент, який записується ++$змінна, обчислюється до значення, що збільшується (PHP збільшує змінну перед зчитуванням її значення, звідси і назва "преінкремент"). Пост-інкремент, який записується $змінна++, обчислює початкове значення $змінної, до того, як вона була збільшена (PHP збільшує змінну після зчитування її значення, звідси і назва "пост-інкремент").

Дуже поширеним типом виразів є вирази порівняння. Ці вирази обчислюються в значення false або true. PHP підтримує > (більше), >= (більше або дорівнює), == (дорівнює), != (не дорівнює), < (менше) і <= (менше або дорівнює). Мова також підтримує набір операторів строгої еквівалентності: === (дорівнює і того ж типу) і !== (не дорівнює або не того ж типу). Ці вирази найчастіше використовуються всередині умовного виконання, наприклад, в операторах if.

Останнім прикладом виразів, який ми розглянемо тут, є комбіновані операторно-присвоювальні вирази. Ви вже знаєте, що якщо ви хочете збільшити $a на 1, ви можете просто написати $a++ або ++$a. Але що, якщо ви хочете додати до нього більше одиниці, наприклад, 3? Ви можете написати $a++ декілька разів, але це, очевидно, не дуже ефективний і зручний спосіб. Набагато більш поширеною практикою є запис $a = $a + 3. $a + 3 обчислюється до значення $a плюс 3, і присвоюється назад в $a, що призводить до збільшення $a на 3. У PHP, як і в деяких інших мовах, таких як C, ви можете написати це коротшим способом, який з часом стане зрозумілішим і швидшим для розуміння. Додавання 3 до поточного значення $a можна записати $a += 3. Це означає "візьміть значення $a, додайте до нього 3 і поверніть його назад в $a". Крім того, що це коротше і зрозуміліше, це також призводить до швидшого виконання. Значення $a += 3, як і при звичайному присвоюванні, є присвоєним значенням. Зверніть увагу, що це НЕ 3, а комбіноване значення $a плюс 3 (це значення, яке присвоюється $a). У цьому режимі присвоювання можна використовувати будь-який двомісний оператор, наприклад, $a -= 5 (відняти 5 від значення $a), $b *= 7 (помножити значення $b на 7) тощо.

Існує ще один вираз, який може здатися дивним, якщо ви не зустрічали його в інших мовах, - потрійний умовний оператор:

<?php
$first ? $second : $third
?>

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

Наступний приклад допоможе вам краще зрозуміти пре- і пост-інкремент та вирази в цілому:

<?php
function double($i)
{
    return $i*2;
}
$b = $a = 5;        /* assign the value five into the variable $a and $b */
$c = $a++;          /* post-increment, assign original value of $a 
                       (5) to $c */
$e = $d = ++$b;     /* pre-increment, assign the incremented value of 
                       $b (6) to $d and $e */

/* at this point, both $d and $e are equal to 6 */

$f = double($d++);  /* assign twice the value of $d before
                       the increment, 2*6 = 12 to $f */
$g = double(++$e);  /* assign twice the value of $e after
                       the increment, 2*7 = 14 to $g */
$h = $g += 10;      /* first, $g is incremented by 10 and ends with the 
                       value of 24. the value of the assignment (24) is 
                       then assigned into $h, and $h ends with the value 
                       of 24 as well. */
?>

Деякі вирази можна розглядати як твердження. У цьому випадку оператор має вигляд "expr ;", тобто вираз, за яким слідує крапка з комою. У виразі $b = $a = 5;, $a = 5 є допустимим виразом, але сам по собі він не є оператором. Вираз $b = $a = 5;, однак, є правильним твердженням.

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

PHP надає повну і потужну реалізацію виразів, і її документування повністю виходить за рамки цього посібника. Наведені вище приклади повинні дати вам уявлення про те, що таке вирази і як можна створювати корисні вирази. Далі у цьому посібнику ми будемо писати expr для позначення будь-якого допустимого виразу PHP.