Выражения
Выражения — самые важные строительные элементы 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, как и в ряде других языков, например Си,
это же присваивание записывается короче, что увеличит очевидность смысла
и скорость понимания кода по прошествии времени. Тройку к текущему значению
переменной $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.