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