mirror of
https://github.com/php/doc-ru.git
synced 2025-08-16 18:22:04 +00:00
243 lines
16 KiB
XML
243 lines
16 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 4decb44c7141a97e348a1235bbb20d930d2baac0 Maintainer: shein Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<chapter xml:id="language.expressions" xmlns="http://docbook.org/ns/docbook">
|
||
<title>Выражения</title>
|
||
<simpara>
|
||
Выражения — самые важные строительные элементы PHP. Почти всё, что разработчик пишет
|
||
в PHP, — выражение. Самое простое и точное определение
|
||
выражения — «всё, у чего есть значение».
|
||
</simpara>
|
||
<simpara>
|
||
Главные формы выражений — константы и переменные. В записи
|
||
<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. Всё так и произойдёт,
|
||
если всё работает правильно.
|
||
</simpara>
|
||
<para>
|
||
Немного более сложные примеры выражений — функции. Например,
|
||
рассмотрим следующую функцию:
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
function foo ()
|
||
{
|
||
return 5;
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</para>
|
||
<simpara>
|
||
Опираясь на то, что разработчик знаком принципом работы функций (если нет,
|
||
рекомендовано прочитать главу <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>),
|
||
строковые (<type>string</type>) и логические (<type>bool</type>)
|
||
значения (скалярные значения это те, которые нельзя «разбить» на
|
||
меньшие части, в отличие, например, от массивов). PHP поддерживает также два
|
||
сложных (составных, композитных — нескалярных) типа: массивы и объекты. Каждое из этих
|
||
типов значений разрешено присваивать переменной или возвращать функцией.
|
||
</simpara>
|
||
<simpara>
|
||
Однако PHP использует выражения значительно шире, точно так же, как это делают другие языки.
|
||
PHP — язык с ориентацией на выражения, который почти всё в коде рассматривает как
|
||
выражение. Вернёмся к тому примеру, с которым мы уже имели дело:
|
||
<code>$a = 5</code>. Легко заметить, что здесь есть два значения —
|
||
значение целочисленной константы <code>5</code> и значение переменной <varname>$a</varname>,
|
||
также принимающей значение 5. Но, хотя это неочевидно, здесь есть ещё одно
|
||
значение — значение самого присвоения. Само присвоение вычисляется в
|
||
присвоенное значение, в данном случае — в 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>
|
||
и <code>variable--</code>. Это <link linkend="language.operators.increment">
|
||
операторы инкремента и декремента</link>. Как и язык Си, язык PHP
|
||
поддерживает два типа инкремента — префиксный и постфиксный. Они
|
||
оба инкрементируют значение переменной и эффект их действия на неё
|
||
одинаков. Разница состоит в значении выражения инкремента.
|
||
Префиксный инкремент, записываемый как <code>++$variable</code>,
|
||
вычисляется в инкрементированное значение (PHP инкрементирует переменную до того
|
||
как прочесть её значение, отсюда название «преинкремент»).
|
||
Постфиксный инкремент, записываемый как <code>$variable++</code>,
|
||
вычисляется в первоначальное значение переменной <varname>$variable</varname> до её приращения
|
||
(PHP вначале читает значение переменной и только потом инкрементирует её, отсюда
|
||
название «постинкремент»).
|
||
</simpara>
|
||
<simpara>
|
||
Распространённые типы выражений — выражения <link
|
||
linkend="language.operators.comparison">сравнения</link>.
|
||
Эти выражения вычисляются либо как &false; (ложь),
|
||
либо как &true; (истина). PHP поддерживает операции сравнения > (больше), >= (больше
|
||
либо равно), == (равно), != (не равно), < (меньше) и <=
|
||
(меньше либо равно). Он также поддерживает операторы строгого
|
||
равенства: === (равно и одного типа) и !== (не равно или не одного
|
||
типа). Обычно этими выражениями пользуются в операторах условного выполнения,
|
||
например, инструкции <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, как и в ряде других языков, например Си,
|
||
разрешено записать это более коротким образом, что увеличит очевидность смысла
|
||
и скорость понимания кода по прошествии времени. Прибавить 3 к текущему значению
|
||
переменной <varname>$a</varname> можно, записав <code>$a += 3</code>.
|
||
Это означает дословно «взять значение <varname>$a</varname>, прибавить к
|
||
нему 3 и снова присвоить его переменной <varname>$a</varname>». Кроме
|
||
большей понятности и краткости, это быстрее работает. Значением
|
||
выражения <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)
|
||
и т. д.
|
||
</simpara>
|
||
<para>
|
||
Ещё одно выражение, которое выглядит необычно,
|
||
если читатель не встречал такое выражение в других языках, — тернарный условный
|
||
оператор:
|
||
</para>
|
||
<para>
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$first ? $second : $third
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</para>
|
||
<para>
|
||
Если значение первого подвыражения — &true; (ненулевое значение),
|
||
то выполняется второе подвыражение, которое и будет результатом
|
||
условного выражения. Или выполняется третье
|
||
подвыражение и его значение будет результатом.
|
||
</para>
|
||
<para>
|
||
Задача следующего примера — помочь немного улучшить понимание
|
||
префиксного и постфиксного инкремента и выражений:
|
||
</para>
|
||
<para>
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?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. */
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</para>
|
||
<simpara>
|
||
Иногда PHP рассматривает выражения как инструкции.
|
||
В этом случае у инструкции следующий вид — «<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 в
|
||
этой документации будет использовано сокращение <varname>expr</varname>.
|
||
</simpara>
|
||
</chapter>
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|