语言参考手册
PHP中文手册首页

表达式

表达式是PHP最重要的基石。 在PHP中,所有你写的东西几乎都是表达式。 最简单也是最精确的对表达式的定义方式是“任何有值的东西都是表达式”。

表达式最基本的形式就是常量和变量。 当你输入"$a = 5",你把'5'赋值给$a,显然,包含值5,也就是说'5'是一个值为5的表达式(在这里,'5'是一个整数常量)。

赋值之后,你会期望$a的值也是5,所以如果你输入$b = $a,那么你希望它的行为恰如你输入$b = 5。也就是说,$a是一个值为5的表达是。 如果一切正常,就会是这样的。

稍微复杂一点的就是当表达式是函数时的例子。 例如,如下面的函数:

<?php
function foo ()
{
    return 
5;
}
?>

假定你很熟悉函数的概念(),你可以假定输入$c = foo()正如输入$c = 5,那么你猜对了。 函数是表达式,它们的值就是它们的返回值。 因为foo()返回5,所以表达式'foo()'的值为5。 通常函数不会不经任何计算就返回一个静态的值。

当然,PHP中的值不仅限于整数,而且通常它们也不是整数。 PHP支持四种简单类型的值:整数值,浮点值(float),字符串值以及布尔值(简单类型是不能被分为更小部分的值,例如,不像数组)。 PHP还支持两种组合类型(非简单类型)的值:数组和对象。 这些值都可以被赋值给变量,或者由函数返回。

PHP对表达式的支持还有很多,就像很多其他语言做的那样。 PHP是一种面向表达式的语法,可以说任何东西都是表达式。 想一下我们刚才看的例子,'$a = 5'。很容易看出这里有两个值,整数常量'5'的值,以及$a的值,它刚被更新为5。 但是事实上,这里还有额外的值参与其中,就是被赋值语句本身的那个值。赋值语句本身的值等于被赋值的值,在这里就是5。也就是说'$a = 5',不去想它做了什么,它本身是一个值为5的表达式。所以,输入'$b = ($a = 5)'就等于输入'$a = 5; $b = 5;'(分号表示一个语句的结束)。因为赋值是由右往左解析的,你也可以写成'$b = $a = 5'。

面向表达式的另外一个好例子就是前增后增或者前减后减操作。PHP或者其他语言的用户一定很熟悉记号'$变量++'和'$变量--'。 他们是增减运算符。 在PHP/FI 2中,语句'$a++'没有值(不是表达式),所以你也不能用其赋值或者用其他方式使用它。 PHP就像C语言那样,把这些语句变成表达式,增强了增减操作的能力。 在PHP中,类与C语言,有两种自增操作,前增和后增。 不管前增还是后增,它们都实质上改变了变量的值,而已对于变量的效果是统一的。 唯一不同的是自增表达式的值。 前增表达式,写作'++$变量',等于已经自增后的值(PHP在读取它的值之前自增它的值,所以叫做'前增')。 后增表达式,写作'$variable++',等于变量自增前的原始值(PHP在读取它的值之后自增它的值,所以叫做'后增')。

比较 表达式是一种非常常见的表达式。 这些表达式的值要么是FALSE要么是TRUE。 PHP支持>(大于),>=(大于等于),==(等于),!=(不等于),<(小于)以及<=(小于等于)等比较运算符。 它还支持一组严格等价运算符:===(等于而且类型相同)以及!==(不等于或者类型不同)。 这些表达式通常用于条件语句,如if中。

我们这里处理的最后一个表达式的例子是运算符和赋值组合的表达式。 我们知道如果你想让$a加1,你可以简单的写成'$a++'或者'++$a'。 但是如果你想加更多呢,比如加3?你可以写好几次'$a++',但是显然这是低效和令人不舒服的方式。 更常见的做法是写成'$a = $a + 3'。 '$a + 3'等于$a的值加上3,然后赋值回$a,结果就是$a的值增长了3。 在PHP里,和其他语言如同C一样,你可以用一个缩写方式,这种方式越来越清晰易懂。 把3加到当前$a的值中,可以写成'$a += 3'。 这等于说,“取得$a的值,然后加3,然后把它赋值回$a”。 这不仅令代码更短更清晰,而且可以让它执行更快。 '$a += 3'的值和一般的赋值语句一样,是被赋值的那个值。 注意它不是3,而是$a和3相加的结果(也就是被赋予$a的值)。 任何二元运算符都可以用于这种运算符赋值模式,例如'$a -= 5'($a减5),'$b *= 7'($b的值乘以7),等等。

还有一些表达式,如果你没在别的语言中看到过的话,可能会觉得很奇怪,比如三元条件运算符:

<?php
$first 
$second $third
?>

如果第一个子表达式的值为TRUE(非零),第二个子表达式的值就会被作为这个条件表达式的值。否则第三个子表达式的值作为这个条件表达式的值。

下面的例子可以帮助你更好的理解前增或者后增表达式:

<?php
function double($i)
{
    return 
$i*2;
}
$b $a 5;        /* assign the value five into the variable $a and $b */
$c $a++;          /* post-increment, assign original value of $a 
                       (5) to $c */
$e $d = ++$b;     /* pre-increment, assign the incremented value of 
                       $b (6) to $d and $e */

/* at this point, both $d and $e are equal to 6 */

$f double($d++);  /* assign twice the value of $d before
                       the increment, 2*6 = 12 to $f */
$g double(++$e);  /* assign twice the value of $e after
                       the increment, 2*7 = 14 to $g */
$h $g += 10;      /* first, $g is incremented by 10 and ends with the 
                       value of 24. the value of the assignment (24) is 
                       then assigned into $h, and $h ends with the value 
                       of 24 as well. */
?>

一些表达式可以被看作语句。 在这种情况下,语句的形式是'expr' ';',也就是说一个表达式后面跟着一个分号。 在'$b=$a=5;'中,$a=5是一个合法的表达式,但是它本身不算一个语句。 而'$b=$a=5;'是一个合法的语句。

最后值得一提的是表达式的真值。 当表达式出现在条件选择语句和循环中的大多数时候,你不会在乎表达式的具体值,只是关心它意味着TRUE还是FALSE。 常量TRUEFALSE (大小写不敏感)是布尔类型的两个可能值。 如果需要,表达式会自动转换为布尔值。 参见关于类型转换的章节了解详情。

PHP提供了全面强大的表达式实现,全面的描述它们超越了这个手册的范围。 上面的例子可能能告诉你什么是表达式,以及如何构建拥有的表达式。 本手册的其他部分,我们将使用expr代表任何合法的PHP表达式。


语言参考手册
PHP中文手册首页





代码中国其他文档:Google Maps API文档 | Google文件系统论文 | 《信息检索》翻译版