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