Выражения

Выражения — это самые важные строительные элементы PHP. Почти всё, что разработчик пишет в PHP, — выражение. Самое простое и точное определение выражения — «всё, у чего есть значение».

Основные формы выражений — это константы и переменные. Если записать $a = 5, значение 5 будет присвоено переменной $a. У значения 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 и других языков возможно уже знакомы с формой записи variable++ и variable--. Это операторы инкремента и декремента. Как и язык Си, язык PHP поддерживает два типа инкремента — префиксный и постфиксный. Они оба инкрементируют значение переменной и эффект их действия на неё одинаков. Разница состоит в значении выражения инкремента. Префиксный инкремент, записываемый как ++$variable, вычисляется в инкрементированное значение (PHP инкрементирует переменную до того как прочесть её значение, отсюда название «преинкремент»). Постфиксный инкремент, записываемый как $variable++, вычисляется в первоначальное значение переменной $variable до её приращения (PHP вначале читает значение переменной и только потом инкрементирует её, отсюда название «постинкремент»).

Распространённые типы выражений — это выражения сравнения. Эти выражения оцениваются либо как false (ложь), либо как true (истина). PHP поддерживает операции сравнения > (больше), >= (больше либо равно), == (равно), != (не равно), < (меньше) и <= (меньше либо равно). Он также поддерживает операторы строгого равенства: === (равно и одного типа) и !== (не равно или не одного типа). Обычно этими выражениями пользуются в операторах условного выполнения, например, инструкции if.

Последний пример выражений, который будет здесь рассмотрен, это смешанные выражения операции и присвоения. Мы уже знаем, что если нужно увеличить значение переменной $a на 1, можно просто написать $a++ или ++$a. Но что, если нужно прибавить больше единицы, например, 3? Можно было бы написать $a++ много раз, однако, очевидно, это не очень рационально и удобно. Более распространённая практика — запись вида $a = $a + 3. Выражение $a + 3 вычисляется в значение переменной $a, к которому прибавлено 3 и снова присвоено значение переменной $a, увеличивая в результате значение переменной $a на 3. В PHP, как и в ряде других языков, например Си, разрешено записать это более коротким образом, что увеличит очевидность смысла и скорость понимания кода по прошествии времени. Прибавить 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
?>

Если значение первого подвыражения — true (ненулевое значение), то выполняется второе подвыражение, которое и будет результатом условного выражения. Или выполняется третье подвыражение и его значение будет результатом.

Задача следующего примера — помочь немного улучшить понимание префиксного и постфиксного инкремента и выражений:

<?php

function double($i)
{
return
$i*2;
}

$b = $a = 5; /* присвоить значение пять переменным $a и $b */
$c = $a++; /* постфиксный инкремент, присвоить значение переменной
$a (5) — переменной $c */
$e = $d = ++$b; /* префиксный инкремент, присвоить увеличенное
значение переменной $b (6) — переменным $d и $e */

/* в этой точке и переменная $d, и переменная $e равны 6 */

$f = double($d++); /* присвоить удвоенное значение перменной $d перед
инкрементом (2 * 6 = 12) — переменной $f */
$g = double(++$e); /* присвоить удвоенное значение перменной $e после
инкремента (2 * 7 = 14) — переменной $g */
$h = $g += 10; /* сначала переменная $g увеличивается на 10,
приобретая, в итоге, значение 24. Затем значение
присвоения (24) присваивается переменной $h,
которая в итоге также становится равной 24. */
?>

Иногда PHP рассматривает выражения как инструкции. В этом случае у инструкции следующий вид — «expr ;», то есть выражение, за которым следует точка с запятой. В записи $b = $a = 5;, часть $a = 5 — допустимое выражение, но оно само — не инструкция. Тогда как запись $b = $a = 5; — допустимая инструкция.

Последнее, что нужно вспомнить, — это истинность значения выражений. Обычно в условных операторах и циклах может интересовать не конкретное значение выражения, а только его истинность (значение true или false). Константы true и false (регистронезависимые) — это два возможных логических значения. Выражения разрешено автоматически преобразовать в логическое значение. Подробнее о том, как это сделать, рассказано в разделе о приведении типов.

Язык PHP со всей полнотой и мощностью реализует выражения, и их полное документирование выходит за рамки этого руководства. Примеры выше дают представление о выражениях, о том, что они из себя представляют, и как можно создавать полезные выражения. Для обозначения любого верного выражения PHP в этой документации будет использовано сокращение expr.