|
Выражения это краеугольный камень PHP. В PHP вы почти всё записываете в
виде выражений. Точнее и проще всего определить выражение как "нечто, имеющее значение".
Базовыми формами выражений являются константы и переменные.
Если вы записываете "$a = 5", вы присваиваете '5' переменной $a. '5', очевидно,
имеет значение 5 или, другими словами, '5' это выражение со значением 5 (в
данном случае '5' это целочисленная/integer константа).
После этого присвоения вы предполагаете, что $a имеет значение 5, поэтому,
если вы записываете $b = $a, вы ожидаете, что результат будет таким же, что и
при записи $b = 5. Иначе говоря, $a это выражение со значением 5. Если всё
работает правильно, результат будет именно таким.
Более сложным примером выражения являются функции. Например, рассмотрим функцию: function foo ()
{
return 5;
} |
Будем считать, что вы уже знакомы с понятием "функция" (если нет,
просмотрите главу о функциях), и предполагаете, что запись $c = foo() даёт тот же результат,
что и запись $c = 5, - и будете правы. Функция является выражением, имеющим значение своего return-значения.
Поскольку foo() возвращает/return 5, значением выражения 'foo()' является 5.
Обычно функции не просто возвращают статичное значение, а что-то вычисляют.
Разумеется, значения в PHP не обязательно должны быть только целочисленными. PHP
поддерживает три типа скалярных значений: integer/целочисленные,
с плавающей точкой/floating point и строковые/string значения (скалярными
являются значения, которые нельзя 'разбить' на небольшие части, как, например, это можно делать с массивами).
PHP также поддерживает два сложных (нескалярных) типа: массивы и объекты.
Каждый из этих типов может быть присвоен переменной или возвращён из функции.
Итак, пользователи PHP/FI 2 не должны почувствовать каких-либо изменений.
Однако PHP продвинул выражения значительно дальше, как и многие другие языки. PHP
это язык, ориентированный на выражения, рассматривающий почти любое действие как
выражение. Рассмотрим тот же пример: '$a = 5'. Хорошо видно, что здесь
имеются два значения, значение целочисленной константы '5' и значение
переменной $a, которая также обновляется до 5. Но здесь имеется и ещё одно
дополнительное значение: это значение самого присвоения. Само присвоение
вычисляется в присвоенное значение, в данном случае - в 5.
На практике это означает, что '$a = 5', независимо от того, что оно делает,
является выражением со значением 5. Таким образом, если записать что-нибудь вроде
'$b = ($a = 5)', это будет равносильно записи '$a = 5; $b = 5;' (;
обозначает конец оператора). Поскольку присвоения разбираются слева направо, вы можете также записать '$b = $a = 5'.
Другой хороший пример ориентации на выражения - пре- и пост-инкремент и
декремент. Пользователи PHP/FI 2 и многих других языков уже наверняка знакомы
с нотацией переменная++ и переменная--. Это операции инкремента и декремента.
В PHP/FI 2 оператор '$a++' не имеет значения (не является выражением), и,
таким образом, вы не можете присвоить его или использовать иным образом.
PHP улучшает возможности операций increment/decrement, делая их также выражениями, как в C. В PHP, как и в C, есть два типа инкремента: pre-increment и post-increment.
И pre-increment, и post-increment увеличивают значение переменной на 1, и
значения переменной идентичны. Разница в значении выражения инкремента.
Pre-increment, который записывается как '++$variable', вычисляется в новое
значение (PHP сначала увеличивает значение, прежде чем его прочитать, отсюда
название 'pre-increment'). Post-increment, который записывается '$variable++',
вычисляет оригинальное значение переменной
$variable, а затем выполняет инкремент (PHP увеличивает переменную после
чтения её значения, отсюда название 'post-increment').
Очень распространённый тип выражений - выражения сравнения. Они вычисляются в 0 или 1, означая
FALSE или TRUE
(соответственно). PHP поддерживает > (больше), >= (больше или равно), == (равно), != (не
равно), < (меньше) и <= (меньше или равно). Эти выражения чаще всего используются внутри условных
операторов, таких как if. Последний пример выражений, рассматриваемых нами здесь, это комбинированные
выражения вида операция-присвоение. Вы уже знаете, что, если вы хотите
увеличить $a на 1, вы просто записываете '$a++' или '++$a'.
Но что, если вы хотите добавить больше, чем 1, например, 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 -= 5' (вычесть 5
из значения переменной $a), '$b *= 7' (умножить значение переменной $b на 7), etc.
Имеется ещё одно выражение, которое может показаться неоднозначным, если вы
не встречали его в других языках, тернарная условная операция:
$first ? $second : $third |
Если значение первого подвыражения TRUE (не нуль), то вычисляется второе
подвыражение, которое становится результатом
всего условного выражения. Иначе вычисляется третье выражение, которое и становиться значением.
Следующий пример должен помочь понять pre- и post-increment и выражения:
function double($i)
{
return $i*2;
}
$b = $a = 5; /* присвоить значение 5 переменным $a и $b */
$c = $a++; /* post-increment, присвоить оригинальное значение $a
(5) переменной $c */
$e = $d = ++$b; /* pre-increment, присвоить увеличенное значение
$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, и $h получает окончательное
значение - также 24 . */ |
В начале главы мы говорили, что опишем различные типы операторов, и, как и
было обещано, показали, что выражения могут быть операторами. Однако не
каждое выражение является оператором. В нашем случае оператор имеет форму 'expr' ';'
- то есть выражения с последующим символом "точка с запятой". В '$b=$a=5;', $a=5
является правильным выражением, но это не оператор. '$b=$a=5;', однако, это правильный оператор.
Последнее важное, что необходимо рассмотреть, это условная часть выражений.
Часто (особенно в при условном выполнении и в циклах) вас интересует не
конкретное значение выражения, а только то, вычисляется оно в TRUE или в FALSE.
Константы TRUE и FALSE (чувствительны к регистру) это два возможных булевых значения. Когда это
необходимо, выражение автоматически конвертируется в boolean. См.
раздел о приведении типов.
PHP предоставляет полную и мощную реализацию выражений, и документирование
их выходит за рамки данного учебника. Вышеприведённые примеры должны дать вам
хорошее представление о том, что такое выражения и как вы их можете
конструировать. В последующих разделах учебника мы будем записывать expr для
обозначения правильного PHP-выражения. |
|