<?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 => 'zh',
  ),
  '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' => 'zh',
    '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 /></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 和 C
    语言中，有两种类型的递增——前递增和后递增。本质上来讲，前递增和后递增均增加了变量的值，并且对于变量的影响是相同的。不同的是递增表达式的值。前递增，写做
    <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;= (小于等于)。PHP
    还支持全等运算符 ===（值和类型均相同）和非全等运算符
    !==（值或者类型不同）。这些表达式都是在条件判断语句，比如 <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>。但是如果想为变量增加大于
    1 的值，比如 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 及其它几种类似 C
    的语言中，可以以一种更加简短的形式完成上述功能，随着时间的推移，会变得更加清晰、更容易理解。为
    <var class="varname">$a</var> 的当前值加 3，可以这样写 <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>（从变量 <var class="varname">$a</var> 的值中减去 5），<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 />$first </span><span style="color: #007700">? </span><span style="color: #0000BB">$second </span><span style="color: #007700">: </span><span style="color: #0000BB">$third<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 /></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 /></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">/* 赋值 5 到变量 $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">/* 后自增，将 $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">/* 前自增，将 $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 ，即 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 ，即 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 后等于 24。然后将值（24）赋值给了 $h，<br />                       $h 的值也等于 24。 */<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   <p class="simpara">
    一些表达式可以被当成语句。这时，一条语句的形式是 &#039;<code class="code">expr ;</code>&#039;，即一个表达式加一个分号结尾。在
    <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 提供了一套完整强大的表达式实现，并且完全纪录它超出了本手册的范围。上面的例子帮助了解了表达式的概念以及如何构建有用的表达式。在本手册的其余部分，将编写
    <var class="varname">expr</var> 来指示任何有效的 PHP 表达式。
   </p>
  </div>
<?php manual_footer($setup); ?>