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