一、表达式
在 PHP 中,表达式是最重要的构建部分。几乎所有的代码都可以看作是表达式,简单而精确的表达式定义是“任何有值的东西”。
常量和变量是最基本的表达式形式。例如,当键入 $a = 5 时,值 5 将被分配给变量 $a,此时 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 支持四种标量值(标量值不能拆分为更小的单元,例如,和数组不同)类型:
- int 值
- 浮点数值(float)
- string 值
- bool 值
PHP 也支持两种复合类型:
- 数组
- 对象
这些值类型可以赋值给变量或者从函数返回。
PHP 是一种面向表达式的语言,从这一方面来讲几乎一切都是表达式。考虑刚才已经研究过的例子 $a = 5。很显然这里涉及到两个值,整数常量 5 的值以及变量 $a 的值,也被更新为 5。但事实是这里还涉及到一个额外的值,即附值语句本身的值。赋值语句本身求值为被赋的值,即 5。实际上这意味着 $a = 5,无论做什么,都是一个值为 5 的表达式。因此编写 $b = ($a = 5) 跟编写 $a = 5; $b = 5;(分号标志着语句的结束)是一样的。因为赋值操作的顺序是由右到左的,也可以写成 $b = $a = 5。
另外一个很好的面向表达式的例子就是前、后递增和递减。PHP 和多数其它语言的用户应该比较熟悉 variable++ 和 variable– 符号。即递增和递减运算符。在 PHP 和 C 语言中,有两种类型的递增——前递增和后递增。本质上来讲,前递增和后递增均增加了变量的值,并且对于变量的影响是相同的。不同的是递增表达式的值。前递增,写做 ++$variable,求增加后的值(PHP 在读取变量的值之前,增加变量的值,因而称之为“前递增”)。后递增,写做 $variable++,求 $variable 未递增之前的原始值(PHP 在读取变量的值之后,增加变量的值,因而叫做“后递增”)。
二、比较表达式
一个常用到的表达式类型是比较表达式。这些表达式求值 false 或 true。PHP 支持 >(大于)、>=(大于等于)、==(等于)、!=(不等于)、<(小于)、<= (小于等于)。PHP 还支持全等运算符 ===(值和类型均相同)和非全等运算符 !==(值或者类型不同)。这些表达式都是在条件判断语句,比如 if。
三、运算赋值表达式
已经知道如果想要为变量 $a 加 1,可以简单的写 $a++ 或者 ++$a。但是如果想为变量增加大于 1 的值,比如 3,接下来可以写 $a++ 多次,但这样明显不是一种高效舒适的方法,一个更加便捷的做法是 $a = $a + 3。$a + 3 计算 $a 加上 3 的值,并将其赋予给 $a,于是 $a 的值增加了 3。
在 PHP 及其它几种类似 C 的语言中,可以以一种更加简短的形式完成上述功能,随着时间的推移,会变得更加清晰、更容易理解。为 $a 的当前值加 3,可以这样写 $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; /* 赋值 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。 */ ?>
表达式可以被当作语句使用,形式为 ‘expr ;’,即一个表达式后跟一个分号。例如,在 $b = $a = 5; 中,$a = 5 是一个有效的表达式,但它本身不是一条语句。而整个语句 $b = $a = 5; 才是一条有效的语句。但有些情况下并不关心表达式的具体值,而只关心它是 true 还是 false。在条件执行和循环等情况下,通常关注表达式的真假值。PHP 中有两个布尔值常量,即 true 和 false(大小写不敏感),表达式会自动转换为布尔值。
总而言之,PHP 提供了强大且完整的表达式实现。上述例子详细讲述了表达式的概念以及如何构建有用的表达式。