mirror of
https://github.com/php/doc-zh.git
synced 2026-03-23 22:52:08 +01:00
177 lines
9.0 KiB
XML
177 lines
9.0 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- $Revision$ -->
|
||
<!-- EN-Revision: f4f96ef8b2a95283c92ea2183fe1dedf06f3ad22 Maintainer: Altair Status: ready -->
|
||
<!-- CREDITS: dallas, mowangjuanzi -->
|
||
<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 和 C
|
||
语言中,有两种类型的递增——前递增和后递增。本质上来讲,前递增和后递增均增加了变量的值,并且对于变量的影响是相同的。不同的是递增表达式的值。前递增,写做
|
||
<code>++$variable</code>,求增加后的值(PHP 在读取变量的值之前,增加变量的值,因而称之为“前递增”)。后递增,写做
|
||
<code>$variable++</code>,求 <varname>$variable</varname> 未递增之前的原始值(PHP
|
||
在读取变量的值之后,增加变量的值,因而叫做“后递增”)。
|
||
</simpara>
|
||
|
||
<simpara>
|
||
一个常用到的表达式类型是<link
|
||
linkend= "language.operators.comparison">比较表达式</link>。这些表达式求值
|
||
&false; 或 &true;。PHP
|
||
支持 >(大于)、>=(大于等于)、==(等于)、!=(不等于)、<(小于)、<= (小于等于)。PHP
|
||
还支持全等运算符 ===(值和类型均相同)和非全等运算符
|
||
!==(值或者类型不同)。这些表达式都是在条件判断语句,比如 <code>if</code>。
|
||
</simpara>
|
||
|
||
<simpara>
|
||
这里,将要研究的最后一个例子是组合的运算赋值表达式。已经知道如果想要为变量 <varname>$a</varname>
|
||
加 1,可以简单的写 <code>$a++</code> 或者 <code>++$a</code>。但是如果想为变量增加大于
|
||
1 的值,比如 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
|
||
的语言中,可以以一种更加简短的形式完成上述功能,随着时间的推移,会变得更加清晰、更容易理解。为
|
||
<varname>$a</varname> 的当前值加 3,可以这样写 <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>(从变量 <varname>$a</varname> 的值中减去 5),<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; /* 赋值 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,
|
||
$h 的值也等于 24。 */
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</para>
|
||
<simpara>
|
||
一些表达式可以被当成语句。这时,一条语句的形式是 '<code>expr ;</code>',即一个表达式加一个分号结尾。在
|
||
<code>$b = $a = 5;</code> 中,<code>$a = 5</code>
|
||
是一个有效的表达式,但它本身不是一条语句。<code>$b = $a = 5;</code> 是一条有效的语句。
|
||
</simpara>
|
||
<simpara>
|
||
最后一件值得提起的事情就是表达式的真假值。在许多事件中,主要是在条件执行和循环中,不要关心表达式中的具体值,反而要注意表达式的值是否是
|
||
&true; 或者 &false;。常量 &true; 和 &false;(大小写无关)是两种可能的
|
||
布尔值。必要时,表达式将自动转换为布尔值。参见<link
|
||
linkend="language.types.typecasting">类型强制转换</link>获取详细信息。
|
||
</simpara>
|
||
<simpara>
|
||
PHP 提供了一套完整强大的表达式实现,并且完全纪录它超出了本手册的范围。上面的例子帮助了解了表达式的概念以及如何构建有用的表达式。在本手册的其余部分,将编写
|
||
<varname>expr</varname> 来指示任何有效的 PHP 表达式。
|
||
</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
|
||
-->
|