@ -4,32 +4,33 @@
<chapter xml:id= "language.expressions" xmlns= "http://docbook.org/ns/docbook" >
<title > Выражения</title>
<simpara >
Выражения — это самые важные строительные элементы PHP. Почти всё, что вы пишете
в PHP, является выражением . Самое простое и точное определение
выражения — «все что угодно, имеющее значение».
Выражения — это самые важные строительные элементы PHP. Почти всё, что разработчик пишет
в PHP, — выражение. Самое простое и точное определение
выражения — «всё, у чего есть значение».
</simpara>
<simpara >
Основными формами выражений являются константы и переменные. Если
вы записываете <code > $a = 5</code> , вы присваивает е <code > 5</code> переменной
<varname > $a</varname> . <code > 5</code> , очевидно, имеет значение 5 или, другими словами ,
Основные формы выражений — это константы и переменные. Если
записать <code > $a = 5</code> , значени е <code > 5</code> будет присвоено переменной
<varname > $a</varname> . У значения <code > 5</code> , очевидно, — значение 5 или, говоря по-другому ,
<code > 5</code> — это выражение с о значением 5 (в данном случае <code > 5</code> — это целочисленная
константа).
</simpara>
<simpara >
После этого присвоения вы ожидаете , что значением <varname > $a</varname>
так же является 5, поэтому, если вы написали <code > $b = $a</code> ,
вы полаг аете , что работать это будет так же, как
если бы вы написали <code > $b = 5</code> . Другими словами ,
<varname > $a</varname> это также выражение с о значением 5. Если всё работает
верно, то именно так и произойдёт.
После этого присвоения ожидается , что значение переменной <varname > $a</varname>
то же равно 5, поэтому, если написано <code > $b = $a</code> ,
ожид ается , что работать это будет так же, как
если бы было написано <code > $b = 5</code> . Говоря по-другому ,
переменная <varname > $a</varname> — это также выражение с о значением 5. Если всё работает
верно, то так и произойдёт.
</simpara>
<para >
Немного более сложными примерами выражений являются функции. Например,
рассмотрим следующую функцию:
Немного более сложные примеры выражений — это функции. Например,
рассмотрим следующую функцию:
<informalexample >
<programlisting role= "php" >
<![CDATA[
<?php
function foo ()
{
return 5;
@ -40,94 +41,94 @@ function foo ()
</informalexample>
</para>
<simpara >
Исходя из того, что вы хорошо знакомы с концепцией функций (если нет,
т о прочитайте главу о <link linkend= "language.functions" > функциях</link> ), вы
полагаете , что з апис ь <code > $c = foo()</code> абсолютно
эквивалентна записи <code > $c = 5</code> , и вы правы . Функции -
это выражения, значением которых является то, что возвращает функция.
Поскольку <code > foo()</code> возвращает 5, значением выражения
' <code > foo()</code> ' является 5.
Как правило, функции возвращают не просто статическое значение, а
что-то вычисляют.
Опираясь на то, что разработчик знаком принципом работы функций (если нет,
рекомендован о прочитать главу <link linkend= "language.functions" > о функциях</link> ),
он может предположить , что н апечатат ь <code > $c = foo()</code> —
по смыслу то же, что написать <code > $c = 5</code> , и будет прав. Функции —
это выражения, значение которых — то, что возвращает функция.
Поскольку функция <code > foo()</code> возвращает 5, значением выражения
« <code > foo()</code> » будет 5.
Обычно функции не просто возвращают статическое значение,
а что-то вычисляют.
</simpara>
<simpara >
Разумеется , значения в PHP не обязаны быть целочисленными, и очень
часто ими не являются. PHP поддерживает четыре типа скалярных значений:
целочисленные (<type > int</type> ), с плавающей точкой (<type > float</type> ),
Конечно , значения в PHP не обязаны быть целочисленными, и очень
часто это не так. Язык PHP поддерживает четыре типа скалярных значений:
целочисленные значения (<type > int</type> ), значения с плавающей точкой (<type > float</type> ),
строковые (<type > string</type> ) и логические (<type > bool</type> )
значения (скалярными являются значения, которые вы не можете ' разбить' на
значения (скалярные значения это те , которые нельзя « разбить» на
меньшие части, в отличие, например, от массивов). PHP поддерживает также два
комбинирован ных ( не скалярных) типа: массивы и объекты. Любое значение такого
типа может присваиваться переменной или возвращаться функцией.
сложных (составных, композит ных — нескалярных) типа: массивы и объекты. Каждое из этих
типов значений разрешено присваивать переменной или возвращать функцией.
</simpara>
<simpara >
Однако PHP, как и многие другие языки, понимает гораздо больше выражений .
PHP — это язык, ориентированны й на выражения и рассматривающий почти все как
выражение. Вернёмся к примеру, с которым мы уже имели дело:
<code > $a = 5</code> . Легко заметить, что здесь присутствуют два значения —
Однако PHP использует выражения значительно шире, точно так же, как это делают другие языки .
PHP — это язык с ориентацие й на выражения, который почти всё в коде рассматривает как
выражение. Вернёмся к тому примеру, с которым мы уже имели дело:
<code > $a = 5</code> . Легко заметить, что здесь есть два значения —
значение целочисленной константы <code > 5</code> и значение переменной <varname > $a</varname> ,
также принимающей значение 5. Н о на самом деле здесь присутствует и ещё одно
также принимающей значение 5. Н о , хотя это неочевидно, здесь есть ещё одно
значение — значение самого присвоения. Само присвоение вычисляется в
присвоенное значение, в данном случае — в 5. Н а практике это означает, что
<code > $a = 5</code> , независимо от того, что оно делает, является
выражением с о значением 5. Таким образ ом, запись <code > $b = ($a = 5)</code>
равносильна записи <code > $a = 5; $b = 5;</code> (точка с запятой о б о значает конец выражения).
Поскольку операции присвоения анализируются справа налево, вы также
можете написать <code > $b = $a = 5</code> .
присвоенное значение, в данном случае — в 5. Т о есть
выражение <code > $a = 5</code> , независимо от того, что оно делает, —
это выражение с о значением 5. Поэт ому запись <code > $b = ($a = 5)</code>
равносильна записи <code > $a = 5; $b = 5;</code> (точка с запятой означает конец выражения).
Поскольку операции присвоения анализируются справа налево, также
разрешено написать <code > $b = $a = 5</code> .
</simpara>
<simpara >
Другой хороший пример ориентированности на выражения — префиксный и
постфиксный инкремент и декремент. Пользователи PHP и многих
других языков возможно уже знакомы с формой записи <code > variable++</code>
постфиксный инкремент и декремент. Пользователи PHP
и других языков возможно уже знакомы с формой записи <code > variable++</code>
и <code > variable--</code> . Это <link linkend= "language.operators.increment" >
операторы инкремента и декремента</link> . Т акже как и C, PHP
операторы инкремента и декремента</link> . К ак и язык Си, язык PHP
поддерживает два типа инкремента — префиксный и постфиксный. Они
о б а инкрементируют значение переменной и эффект их действия на неё
одинаков. Разница состоит в значении выражения инкремента.
Префиксный инкремент, записываемый как <code > ++$variable</code> ,
вычисляется в инкрементированное значение (PHP инкрементирует переменную до того
как прочесть её значение, отсюда название ' пре- инкремент' ).
как прочесть её значение, отсюда название « преинкремент» ).
Постфиксный инкремент, записываемый как <code > $variable++</code> ,
вычисляется в первоначальное значение переменной <varname > $variable</varname> до её приращения
(PHP инкрементирует переменную после прочтения её значения , отсюда
название ' пост- инкремент' ).
(PHP вначале читает значение переменной и только потом инкрементирует её , отсюда
название « постинкремент» ).
</simpara>
<simpara >
Очень р аспространённым типом выражений являются выражения <link
Р аспространённые типы выражений — это выражения <link
linkend= "language.operators.comparison" > сравнения</link> .
Результатом вычислений являются &false; (ложь)
и ли &true; (истина). PHP поддерживает операции сравнения > (больше), > = (больше
Эти выражения оцениваются либо как &false; (ложь),
либ о как &true; (истина). PHP поддерживает операции сравнения > (больше), > = (больше
либо равно), == (равно), != (не равно), < (меньше) и < =
(меньше либо равно). Он также поддерживает операторы строгого
равенства: === (равно и одного типа) и !== (не равно или не одного
типа). Чаще всег о эти выражения ис пользуются в операторах условного выполнения,
таких как <code > if</code> .
типа). Обычн о этими выражениями пользуются в операторах условного выполнения,
например, <code > if</code> .
</simpara>
<simpara >
Последний пример выражений, который мы здесь рассмотрим , это
смешанные выражения операции и присвоения. В ы уже знаете , что если
вы хотите увеличить <varname > $a</varname> на 1, вы можете просто написать
<code > $a++</code> или <code > ++$a</code> . Н о что, если вы
хотите прибавить больше, чем единицу , например, 3? Вы могли бы написать
<code > $a++</code> много раз, однако, очевидно это не очень
рациональный и удобный способ. Гораздо б олее распространённой практикой
является запись вида <code > $a = $a + 3</code> .
<code > $a + 3</code> вычисляется в значение <varname > $a</varname> плюс
3 и снова присваивается <varname > $a</varname> , увеличивая в результате
<varname > $a</varname> на 3. В PHP, как и в некоторых других языка х , таких как C ,
вы можете записать это более коротким образом, что увеличит очевидность смысла
и быстроту понимания кода по прошествии времени. Прибавить 3 к текущему значению
<varname > $a</varname> можно с помощью записи <code > $a += 3</code> .
Это означает дословно " взять значение <varname > $a</varname> , прибавить к
нему 3 и снова присвоить е г о переменной <varname > $a</varname> " . Кроме
Последний пример выражений, который будет здесь рассмотрен , это
смешанные выражения операции и присвоения. М ы уже знаем , что если
нужно увеличить значение переменной <varname > $a</varname> на 1, можно просто написать
<code > $a++</code> или <code > ++$a</code> . Н о что, если нужно
прибавить больше единицы , например, 3? Можно было бы написать
<code > $a++</code> много раз, однако, очевидно, это не очень
рационально и удобно . Б олее распространённая практика —
запись вида <code > $a = $a + 3</code> .
Выражение <code > $a + 3</code> вычисляется в значение переменной <varname > $a</varname> , к которому
прибавлено 3 и снова присвоено значение переменной <varname > $a</varname> , увеличивая в результате
значение переменной <varname > $a</varname> на 3. В PHP, как и в ряде других языков, например Си ,
разрешено записать это более коротким образом, что увеличит очевидность смысла
и скорость понимания кода по прошествии времени. Прибавить 3 к текущему значению
переменной <varname > $a</varname> можно, записав <code > $a += 3</code> .
Это означает дословно « взять значение <varname > $a</varname> , прибавить к
нему 3 и снова присвоить е г о переменной <varname > $a</varname> » . Кроме
большей понятности и краткости, это быстрее работает. Значением
<code > $a += 3</code> , как и обычного присвоения, является присвоенное
выражения <code > $a += 3</code> , как и обычного присвоения, будет присвоенное
значение. Обратите внимание, что это Н Е 3, а суммированное значение
<varname > $a</varname> плюс 3 (то, что было присвоено <varname > $a</varname> ).
Таким образом может использоваться любой бинарный оператор, например,
<code > $a -= 5</code> (вычесть 5 из значения <varname > $a</varname> ),
<code > $b *= 7</code> (умножить значение <varname > $b</varname> на 7)
и т.д.
переменной <varname > $a</varname> плюс 3 (то, что было присвоено перменной <varname > $a</varname> ).
Поэтому разрешено использовать любой бинарный оператор, например,
<code > $a -= 5</code> (вычесть 5 из значения переменной <varname > $a</varname> ),
<code > $b *= 7</code> (умножить значение переменной <varname > $b</varname> на 7)
и т. д.
</simpara>
<para >
Существует ещё одно выражение, которое может выглядеть необычно,
@ -139,6 +140,7 @@ function foo ()
<programlisting role= "php" >
<![CDATA[
<?php
$first ? $second : $third
?>
]]>
@ -146,13 +148,13 @@ $first ? $second : $third
</informalexample>
</para>
<para >
Если значением первого подвыражения является &true; (не ноль ),
Если значение первого подвыражения — &true; (ненулевое значение ),
то выполняется второе подвыражение, которое и будет результатом
условного выражения. В противном случае будет выполнено третье
условного выражения. Или выполняется третье
подвыражение и е г о значение будет результатом.
</para>
<para >
С ледующий пример должен помочь вам немного улучшить понимание
Задача с ледующе г о примера — помочь немного улучшить понимание
префиксного и постфиксного инкремента и выражений:
</para>
<para >
@ -160,22 +162,24 @@ $first ? $second : $third
<programlisting role= "php" >
<![CDATA[
<?php
function double($i)
{
return $i*2;
}
$b = $a = 5; /* присвоить значение пять переменным $a и $b */
$c = $a++; /* постфиксный инкремент, присвоить значение $a
(5) переменной $c */
$c = $a++; /* постфиксный инкремент, присвоить значение переменной
$a (5) — переменной $c */
$e = $d = ++$b; /* префиксный инкремент, присвоить увеличенное
значение $b (6) переменным $d и $e */
значение переменной $b (6) — переменным $d и $e */
/* в этой точке и $d, и $e равны 6 */
/* в этой точке и переменная $d, и переменная $e равны 6 */
$f = double($d++); /* присвоить удвоенное значение $d перед
инкрементом (2* 6 = 12) переменной $f */
$g = double(++$e); /* присвоить удвоенное значение $e после
инкремента (2* 7 = 14) переменной $g */
$f = double($d++); /* присвоить удвоенное значение перменной $d перед
инкрементом (2 * 6 = 12) — переменной $f */
$g = double(++$e); /* присвоить удвоенное значение перменной $e после
инкремента (2 * 7 = 14) — переменной $g */
$h = $g += 10; /* сначала переменная $g увеличивается на 10,
приобретая, в итоге, значение 24. Затем значение
присвоения (24) присваивается переменной $h,
@ -186,29 +190,29 @@ $h = $g += 10; /* сначала переменная $g увеличива
</informalexample>
</para>
<simpara >
Некоторые выражения могут рассматривать ся как инструкции. В
данном случае инструкция имеет вид ' <code > expr ;</code> ' — выражение с
по следующей точкой с запятой. В записи <code > $b = $a = 5;</code> ,
<code > $a = 5</code> — это верное выражение, но само по с е б е не инструкция.
Тогда как <code > $b = $a = 5;</code> является верной инструкцией .
Иногда выражения рассматриваю тся как инструкции.
В данном случае у инструкции следующий вид — « <code > expr ;</code> » — выражение с о
следующей за ним точкой с запятой. В записи <code > $b = $a = 5;</code> ,
<code > $a = 5</code> — это верное выражение, но оно само — не инструкция.
Тогда как выражение <code > $b = $a = 5;</code> — верная инструкция .
</simpara>
<simpara >
Последнее, что стоит упомяну ть, это истинность значения выражений.
В о многих случаях, как правило, в условных операторах и циклах,
вас может интересовать не конкретное значение выражения, а только
Последнее, что нужно вспомни ть, — это истинность значения выражений.
Обычно в условных операторах и циклах
может интересовать не конкретное значение выражения, а только
е г о истинность (значение &true; или &false; ).
<!-- (PHP doesn't have a
dedicated boolean type) : WRONG, PHP does. -->
Константы &true; и &false; (регистронезависимые) — это два
возможных логических значения. Выражения мож но
возможных логических значения. Выражения разреше но
автоматически преобразовать в логическое значение. Подробнее о том, как это
сделать, рассказано в <link linkend= "language.types.typecasting" > разделе о
приведении типов</link> .
</simpara>
<simpara >
PHP предоставляет полную и мощну ю реализацию выражений , и их
Язык PHP с о всей полнотой и мощность ю реализует выражения , и их
полное документирование выходит за рамки этого руководства.
Примеры выше дают представление о выражениях, о том, что
они из себя представляют, и как можно создавать полезные