Выражения
Выражения — самые важные строительные элементы PHP. Почти всё, что разработчик пишет
в PHP, — выражение. Самое простое и точное определение
выражения — «всё, у чего есть значение».
Главные формы выражений — константы и переменные. В записи
$a = 5
значение 5
присвоится переменной
$a. У значения 5
, очевидно, — значение 5 или, говоря по-другому,
5
— выражение со значением 5 (в этом случае 5
— целочисленная
константа).
После этого присвоения ожидается, что значение переменной $a
тоже равно 5, поэтому, если написано $b = $a
,
ожидается, что работать это будет так же, как
если бы было написано $b = 5
. Говоря по-другому,
переменная $a — тоже выражение со значением 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)
и т. д.
Ещё одно выражение, которое выглядит необычно,
если читатель не встречал такое выражение в других языках, — тернарный условный
оператор:
Если значение первого подвыражения — true
(ненулевое значение),
то выполняется второе подвыражение, которое и будет результатом
условного выражения. Или выполняется третье
подвыражение и его значение будет результатом.
Задача следующего примера — помочь немного улучшить понимание
префиксного и постфиксного инкремента и выражений:
Иногда PHP рассматривает выражения как инструкции.
В этом случае у инструкции следующий вид — «expr ;
», то есть выражение,
за которым следует точка с запятой. В записи $b = $a = 5;
,
часть $a = 5
— допустимое выражение, но оно само — не инструкция.
Тогда как запись $b = $a = 5;
— допустимая инструкция.
Последнее, что вспомним, — истинность значения выражений.
Обычно в условных операторах и циклах
может интересовать не конкретное значение выражения, а только
его истинность (значение true
или false
).
Константы true
и false
(регистронезависимые) — два
возможных логических значения. Выражения разрешено
автоматически преобразовать в логическое значение. Подробнее о том, как это
сделать, рассказано в разделе о
приведении типов.
Язык PHP со всей полнотой и мощностью реализует выражения, и их
полное документирование выходит за рамки этого руководства.
Примеры выше дают представление о выражениях, о том, что
они из себя представляют, и как можно создавать полезные
выражения. Для обозначения любого верного выражения PHP в
этой документации будет использовано сокращение expr.