《简明 PHP 教程》05 运算符与表达式

792 阅读4分钟

运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西。

运算符可按照其能接受几个值来分组。一元运算符只能接受一个值,例如 !(逻辑取反运算符)或 ++(递增运算符)。 二元运算符可接受两个值,例如熟悉的算术运算符 +(加)和 -(减),大多数 PHP 运算符都是这种。最后是唯一的三元运算符 ? :,可接受三个值;通常就简单称之为“三元运算符”(尽管称之为条件运算符可能更合适)。

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

运算符

接下来我们将简要了解各类运算符及它们的用法。

要记得你可以随时在解释器中对给出的案例里的表达式进行求值。例如要想测试表达式 2+3,则可以使用交互式 PHP 解释器提示符:

php > echo 2 + 3;
5
php > echo 3 * 5;
15
php > 

下面是可用运算符的速览:

  • -$a(取反), $a 的负值,-3.14 将输出一个负数。
  • $a + $b(加法), a 和b 的和,3 + 5 输出 8
  • $a - $b(减法), a 和b 的差,50 - 24 输出 26
  • $a * $b(乘法), a 和b 的积,2 * 3 输出 6
  • $a / $b(除法), a 除以b 的商,13 / 3 输出 4.3333333333333
  • $a % $b(取模), a 除以b 的余数,13 % 3 输出 1-25.5 % 2.25 输出 -1
  • $a ** $b(乘方), a 的b 次方,3 ** 4 输出 81
  • =(赋值),把右边表达式的值赋给左边的表达式,$a = 3 的值是 3。PHP 支持引用赋值,$var = &$othervar;,意味着两个变量指向了同一个数据。
  • $a & $b(按位与),将把 a 和b 中都为 1 的位设为 1。
  • $a | $b(按位或),将把 a 和b 中任何一个为 1 的位设为 1。
  • $a ^ $b(按位异或),将把 a 和b 中一个为 1 另一个为 0 的位设为 1。
  • ~ $a(按位取反),将 $a 中为 0 的位设为 1,反之亦然。
  • $a << $b(左移),将 a 中的位向左移动b 次(每一次移动都表示“乘以 2”)。
  • $a >> $b(右移),将 a 中的位向右移动b 次(每一次移动都表示“乘以 2”)。
  • $a == $b(等于),TRUE,如果类型转换后 a 等于b。
  • $a === $b(全等),TRUE,如果 a 等于b,并且它们的类型也相同。
  • $a != $b(不等),TRUE,如果类型转换后 a 不等于b。
  • $a <> $b(不等),TRUE,如果类型转换后 a 不等于b。
  • $a !== $b(不全等),TRUE,如果 a 不等于b,或者它们的类型不同。
  • $a < $b(小于),TRUE,如果 a 严格小于b。
  • $a > $b(大于),TRUE,如果 a 严格大于b。
  • $a <= $b(小于等于),TRUE,如果 a 小于或者等于b。
  • $a >= $b(大于等于),TRUE,如果 a 大于或者等于b。
  • $a <=> $b(太空船/组合比较),当 a 小于、等于、大于b 时 分别返回一个小于、等于、大于 0 的 integer 值。 PHP7 开始提供。
  • $a ?? $b ?? $c(NULL 合并操作符),从左往右第一个存在且不为 NULL 的操作数。如果都没有定义且不为 NULL,则返回 NULL。PHP7 开始提供。
  • @(错误控制),当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
  • ``(执行),PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回。
  • ++$a(前加),a 的值加一,然后返回a。
  • $a++(后加),返回 a,然后将a 的值加一。
  • --$a(前减),a 的值减一,然后返回a。
  • $a--(后减),返回 a,然后将a 的值减一。
  • $a and $b(逻辑与),TRUE,如果 a 和b 都为 TRUE。
  • $a or $b(逻辑或),TRUE,如果 a 或b 任一为 TRUE。
  • $a xor $b(逻辑异或),TRUE,如果 a 或b 任一为 TRUE,但不同时是。
  • ! $a(逻辑非),TRUE,如果 $a 不为 TRUE。
  • $a && $b(逻辑与),TRUE,如果 a 和b 都为 TRUE。
  • $a || $b(逻辑或),TRUE,如果 a 或b 任一为 TRUE。
  • .(连接),返回其左右参数连接后的字符串。
  • .=(连接赋值),将右边参数附加到左边的参数之后。
  • $a + $b(数组联合),a 和b 的联合。
  • $a == $b(数组相等),如果 a 和b 具有相同的键/值对则为 TRUE。
  • $a === $b(数组全等),如果 a 和b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。
  • $a != $b(数组不等),如果 a 不等于b 则为 TRUE。
  • $a <> $b(数组不等),如果 a 不等于b 则为 TRUE。
  • $a !== $b(数组不全等),如果 a 不全等于b 则为 TRUE。
  • instanceof(类型),用于确定一个 PHP 变量是否属于某一类 class 的实例。

除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。

取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。

数值运算与赋值的快捷方式

一种比较常见的操作是对一个变量进行一项数学运算并将运算得出的结果返回给这个变量,因此对于这类运算通常有如下的快捷表达方式:

<?php
$a = 2;
$a = $a * 3;

同样也可写作:

<?php
$a = 2;
$a *= 3;

要注意到 变量 = 变量 运算 表达式 会演变成 变量 运算 = 表达式

上述赋值运算将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。

PHP 也支持引用赋值,使用$var = &$othervar;语法。引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。

求值顺序

如果你有一个诸如 2 + 3 * 4 的表达式,是优先完成加法还是优先完成乘法呢?我们的高中数学知识会告诉我们应该先完成乘法。这意味着乘法运算符的优先级要高于加法运算符。

下面将给出 PHP 中从最低优先级(最少绑定)到最高优先级(最多绑定)的优先级表。这意味着,在给定的表达式中,PHP 将优先计算表中位列于后的较高优先级的运算符与表达式。

为了保持完整,下表是从 PHP 参考手册 中引用而来。你最好使用圆括号操作符来对运算符与操作数进行分组,以更加明确地指定优先级。这也能使得程序更加可读。你可以阅读改变运算顺序来了解更多的细节。

改变运算顺序 {#changing-order-of-evaluation}

为了使表达式更加易读,我们可以使用括号。举个例子,2 + (3 * 4) 自是要比 2 + 3 * 4 要更加容易理解,因为后者还要求你了解运算符的优先级。使用括号要适度,同时不要像 (2 + (3 * 4)) 这样冗余。

使用括号还有一个额外的优点——它能帮助我们改变运算的顺序。同样举个例子,如果你希望在表达式中计算乘法之前应先计算加法,那么你可以将表达式写作 (2 + 3) * 4

结合性

运算符通常由左至右结合。这意味着具有相同优先级的运算符将从左至右的方式依次进行求值。如 2 + 3 + 4 将会以 (2 + 3) + 4 的形式加以计算。

表达式

案例(将其保存为 expression.php

<?php
$length = 5;
$breadth = 2;

$area = $length * $breadth;

echo 'Area is ' . $area . "\n";
echo 'Perimeter is ' . 2 * ($length + $breadth) . "\n";

输出:

$ php expression.php
Area is 10
Perimeter is 14

它是如何工作的

矩形的长度(Length)与宽度(Breadth)存储在以各自名称命名的变量中。我们使用它们并借助表达式来计算矩形的面积(Area)与周长(Perimeter)。我们将表达式 $length * $breadth 的结果存储在变量 $area 中并将其通过使用 echo 函数打印出来。在第二种情况中,我们直接在 echo 函数中使用了表达式 2 * ($length + $breadth) 的值。

总结

我们已经了解了如何使用运算符、操作数与表达式——这些是我们构建任何程序的基本块。接下来,我们将看到如何在程序中善加利用这些语句。

关注公众号「展白说」,获取更多有价值的内容。