<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/langref.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'language.expressions.php',
    1 => 'Выражения',
    2 => 'Выражения',
  ),
  'up' => 
  array (
    0 => 'langref.php',
    1 => 'Справочник языка',
  ),
  'prev' => 
  array (
    0 => 'language.constants.magic.php',
    1 => 'Магические константы',
  ),
  'next' => 
  array (
    0 => 'language.operators.php',
    1 => 'Операторы',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/expressions.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.expressions" class="chapter">
 <h1 class="title">Выражения</h1>

 <p class="simpara">
  Выражения — самые важные строительные элементы PHP. Почти всё, что разработчик пишет
  в PHP, — выражение. Самое простое и точное определение
  выражения — «всё, что вычисляется как значение».
 </p>
 <p class="simpara">
  Главные формы выражений — константы и переменные. В записи
  <code class="code">$a = 5</code> значение <code class="code">5</code> присвоится переменной
  <var class="varname">$a</var>. Значение <code class="code">5</code>, очевидно, содержит значение 5 или, говоря по-другому,
  <code class="code">5</code> — выражение со значением 5; в этом случае <code class="code">5</code> — целочисленная
  константа.
 </p>
 <p class="simpara">
  После этого присваивания ожидается, что значение переменной <var class="varname">$a</var>
  тоже равно 5, поэтому, когда записывают <code class="code">$b = $a</code>,
  ожидают, что это сработает так же,
  как если бы написали <code class="code">$b = 5</code>. Говоря по-другому,
  переменная <var class="varname">$a</var> — тоже выражение со значением 5. Всё так и произойдёт,
  если всё работает правильно.
 </p>
 <p class="para">
  Немного более сложные примеры выражений — функции. Например,
  рассмотрим следующую функцию:
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">foo </span><span style="color: #007700">()<br />{<br />    return </span><span style="color: #0000BB">5</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
  </p>
  <p class="simpara">
   Разработчик, который познакомился с концепцией функций
   в главе «<a href="language.functions.php" class="link">О функциях</a>»,
   мог бы предположить, что присваивание <code class="code">$c = foo()</code>
   по смыслу аналогично присваиванию <code class="code">$c = 5</code>, и оказался бы прав.
   Функция — выражение, значение которого равно тому, что возвращает функция.
   Значение выражения <code class="code">foo()</code> равно 5,
   поскольку функция <code class="code">foo()</code> возвращает 5.
   Часто функции не просто возвращают статическое значение,
   а что-то вычисляют.
  </p>
  <p class="simpara">
   Конечно, значения в PHP не обязаны быть целочисленными,
   и часто это не так. Язык PHP поддерживает четыре типа скалярных значений:
   целочисленные <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>, значения с плавающей точкой <span class="type"><a href="language.types.float.php" class="type float">float</a></span>,
   строковые <span class="type"><a href="language.types.string.php" class="type string">string</a></span> и логические <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>.
   Скалярными называются значения, которые нельзя «разбить»
   на меньшие части, в отличие, например, от массивов. Ещё PHP поддерживает два
   сложных (составных, композитных — нескалярных) типа: массивы и объекты. Каждый из этих
   типов значений возможно присвоить переменной или вернуть из функции.
  </p>
  <p class="simpara">
   Однако PHP использует выражения значительно шире, точно так же, как это делают другие языки.
   PHP — язык с ориентацией на выражения, который почти всё в коде рассматривает
   как выражение. Вернёмся к тому примеру, с которым уже имели дело:
   <code class="code">$a = 5</code>. Легко заметить, что здесь содержится два значения —
   значение целочисленной константы <code class="code">5</code> и значение переменной <var class="varname">$a</var>,
   которая также принимает значение 5. Но, хотя это неочевидно, здесь содержится ещё одно
   значение — значение самого присваивания. Само присваивание вычисляется
   в значение, которое присваивется переменной, в приведённом примере — в значение 5. Поэтому
   выражение <code class="code">$a = 5</code> независимо от того, что оно делает, —
   это выражение со значением 5. Поэтому запись <code class="code">$b = ($a = 5)</code>
   равносильна записи <code class="code">$a = 5; $b = 5;</code> (точка с запятой означает конец инструкции).
   Разработчику также доступна запись <code class="code">$b = $a = 5</code>,
   поскольку операции присваивания анализируются справа налево.
  </p>
  <p class="simpara">
   Другой хороший пример ориентированности на выражения — префиксный
   и постфиксный инкремент и декремент. Пользователи PHP
   и других языков, возможно, уже знакомы с формой записи <code class="code">variable++</code>
   и <code class="code">variable--</code>. Это <a href="language.operators.increment.php" class="link">
   операторы инкремента и декремента</a>. Как и язык Си, язык PHP
   поддерживает два типа инкремента — префиксный и постфиксный. Они
   оба инкрементируют значение переменной и эффект их действия на неё
   одинаков. Разница состоит в значении выражения инкремента.
   Префиксный инкремент, записываемый как <code class="code">++$variable</code>,
   вычисляется в инкрементированное значение (PHP инкрементирует переменную до того
   как прочесть её значение, отсюда название «преинкремент»).
   Постфиксный инкремент, записываемый как <code class="code">$variable++</code>,
   вычисляется в первоначальное значение переменной <var class="varname">$variable</var> до её приращения
   (PHP вначале читает значение переменной и только потом инкрементирует её, отсюда
   название «постинкремент»).
  </p>
  <p class="simpara">
   Распространённые типы выражений — выражения <a href="language.operators.comparison.php" class="link">сравнения</a>.
   Эти выражения вычисляются либо как <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> (ложь),
   либо как <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> (истина). PHP поддерживает операции сравнения &gt; (больше), &gt;= (больше
   либо равно), == (равно), != (не равно), &lt; (меньше) и &lt;=
   (меньше либо равно). Он также поддерживает операторы строгого
   равенства: === (равно и одного типа) и !== (не равно или не одного
   типа). Обычно этими выражениями пользуются в операторах условного выполнения,
   например, инструкции <code class="code">if</code>.
  </p>
  <p class="simpara">
   Последний пример выражений, который здесь рассматривается,
   это смешанные выражения операции и присваивания. Уже известно, что когда
   требуется увеличить значение переменной <var class="varname">$a</var> на 1, записывают
   <code class="code">$a++</code> или <code class="code">++$a</code>. Но что, если потребуется
   прибавить больше единицы, например 3? Можно было бы написать
   <code class="code">$a++</code> много раз, однако, очевидно, это нерационально и неудобно.
   Наиболее распространённая практика — запись вида <code class="code">$a = $a + 3</code>.
   Выражение <code class="code">$a + 3</code> вычисляется в значение переменной <var class="varname">$a</var>, к которому
   прибавляется 3 и снова присваивается значение переменной <var class="varname">$a</var>, увеличивая в результате
   значение переменной <var class="varname">$a</var> на 3. В PHP, как и в ряде других языков, например Си,
   это же присваивание записывается короче, что увеличит очевидность смысла
   и скорость понимания кода по прошествии времени. Тройку к текущему значению
   переменной <var class="varname">$a</var> прибавляют так: <code class="code">$a += 3</code>.
   Это означает дословно «взять значение переменной <var class="varname">$a</var>, прибавить
   к нему значение 3 и снова присвоить результат сложения переменной <var class="varname">$a</var>». Кроме
   большей понятности и краткости, это быстрее работает. Значением
   выражения <code class="code">$a += 3</code>, как и стандартного присваивания, станет
   значение, которое присвоилось переменной. Обратите внимание, что это НЕ 3, а суммированное значение
   переменной <var class="varname">$a</var> плюс 3 (то, что присвоилось перменной <var class="varname">$a</var>).
   Поэтому разрешается использовать любой бинарный оператор, например,
   <code class="code">$a -= 5</code> (вычесть 5 из значения переменной <var class="varname">$a</var>),
   <code class="code">$b *= 7</code> (умножить значение переменной <var class="varname">$b</var> на 7)
   и т. д.
  </p>
  <p class="para">
   Ещё одно выражение, которое выглядит необычно,
   если читатель не встречал такое выражение в других языках, — тернарный условный
   оператор:
  </p>
  <p class="para">
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$first </span><span style="color: #007700">? </span><span style="color: #0000BB">$second </span><span style="color: #007700">: </span><span style="color: #0000BB">$third<br /><br />?&gt;</span></span></code></div>
     </div>

    </div>
  </p>
  <p class="para">
   Если значение первого подвыражения — <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> (ненулевое значение),
   то выполняется второе подвыражение, которое и будет результатом
   условного выражения. Или выполняется третье
   подвыражение и его значение будет результатом.
  </p>
  <p class="para">
   Задача следующего примера — помочь немного улучшить понимание
   префиксного и постфиксного инкремента и выражений:
  </p>
  <p class="para">
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">double</span><span style="color: #007700">(</span><span style="color: #0000BB">$i</span><span style="color: #007700">)<br />{<br />    return </span><span style="color: #0000BB">$i</span><span style="color: #007700">*</span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">;        </span><span style="color: #FF8000">/* Присвоить значение пять переменным $a и $b */<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">$a</span><span style="color: #007700">++;          </span><span style="color: #FF8000">/* Постфиксный инкремент, присвоить значение переменной<br />                       $a (5) — переменной $c */<br /></span><span style="color: #0000BB">$e </span><span style="color: #007700">= </span><span style="color: #0000BB">$d </span><span style="color: #007700">= ++</span><span style="color: #0000BB">$b</span><span style="color: #007700">;     </span><span style="color: #FF8000">/* Префиксный инкремент, присвоить увеличенное<br />                       значение переменной $b (6) — переменным $d и $e */<br /><br />/* в этой точке и переменная $d, и переменная $e равны 6 */<br /><br /></span><span style="color: #0000BB">$f </span><span style="color: #007700">= </span><span style="color: #0000BB">double</span><span style="color: #007700">(</span><span style="color: #0000BB">$d</span><span style="color: #007700">++);  </span><span style="color: #FF8000">/* Присвоить удвоенное значение перменной $d перед<br />                       инкрементом (2 * 6 = 12) — переменной $f */<br /></span><span style="color: #0000BB">$g </span><span style="color: #007700">= </span><span style="color: #0000BB">double</span><span style="color: #007700">(++</span><span style="color: #0000BB">$e</span><span style="color: #007700">);  </span><span style="color: #FF8000">/* Присвоить удвоенное значение перменной $e после<br />                       инкремента (2 * 7 = 14) — переменной $g */<br /></span><span style="color: #0000BB">$h </span><span style="color: #007700">= </span><span style="color: #0000BB">$g </span><span style="color: #007700">+= </span><span style="color: #0000BB">10</span><span style="color: #007700">;      </span><span style="color: #FF8000">/* Сначала переменная $g увеличивается на 10,<br />                       приобретая, в итоге, значение 24. Затем значение<br />                       присваивания (24) присваивается переменной $h,<br />                       которая в итоге также становится равной 24. */<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
  </p>
  <p class="simpara">
   Иногда PHP рассматривает выражения как инструкции.
   В этом случае у инструкции следующий вид — «<code class="code">expr ;</code>», то есть выражение,
   за которым следует точка с запятой. В записи <code class="code">$b = $a = 5;</code>,
   часть <code class="code">$a = 5</code> — допустимое выражение, но оно само — не инструкция.
   Тогда как запись <code class="code">$b = $a = 5;</code> — допустимая инструкция.
  </p>
  <p class="simpara">
   Последнее, что вспомним, — истинность значения выражений.
   Обычно в условных операторах и циклах
   может интересовать не конкретное значение выражения, а только
   его истинность (значение <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> или <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>).

   

   Регистронезависимые константы <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> и <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> — два
   возможных логических значения. Выражения автоматически преобразовываются
   в логические значения, когда требуется. Подробнее о преобразовании типов рассказывает раздел
   <a href="language.types.type-juggling.php#language.types.typecasting" class="link">Приведение типов</a>.
  </p>
  <p class="simpara">
   Язык PHP со всей полнотой и мощностью реализует выражения,
   а полное документирование выражений выходит за рамки руководства.
   Приведённые примеры дают представление о выражениях, о том, что
   они из себя представляют, и как создавать полезные
   выражения. В остальной части руководства
   допустимые PHP-выражения обозначают сокращением <var class="varname">expr</var>.
  </p>
</div>
<?php manual_footer($setup); ?>