运算符
使用变量固然很好,但如果我们不能让变量之间相互影响,那就无能为力了。运算符(Operators)是一种元素,它接受一些表达式(即操作数)并对其执行操作以得到结果。运算符最常见的例子是算术运算符,这在前面已经介绍过了。
表达式 几乎是任何有值的东西。变量、数字或文本都是表达式的例子,但你会发现它们可以变得更加复杂。运算符期待特定类型的表达式,例如,算术运算符期待整数或浮点数。但正如你已经知道的,PHP 会尽可能转换所给表达式的类型。
让我们来看看最重要的几组运算符。
算术运算符
算术运算符非常直观,这一点大家已经知道。加法、减法、乘法和除法运算符(+
、-
、*
和 /
)的运算如其名。模乘 (%
) 表示两个操作数相除的余数。幂 (**
) 将第一个操作数提高到第二个操作数的幂。最后,否定 (-
) 则否定操作数。最后一个运算符是唯一只接受一个操作数的算术运算符。
让我们来看几个例子:
<?php
$a = 10;
$b = 3;
var_dump($a + $b); // 13
var_dump($a - $b); // 7
var_dump($a * $b); // 30
var_dump($a / $b); // 3.333333...
var_dump($a % $b); // 1
var_dump($a ** $b); // 1000
var_dump(-$a); // -10
正如您所看到的,它们非常容易理解!
赋值运算符
你已经知道这个操作符了,因为我们已经在示例中使用过它。赋值操作符将表达式的结果赋值给一个变量。现在你已经知道,表达式可以是一个简单的数字,也可以是一系列算术运算的结果。下面的示例将表达式的结果赋值给一个变量:
<?php
$a = 3 + 4 + 5 - 2;
var_dump($a); // 10
有一系列赋值运算符可以作为快捷方式使用。您可以将算术运算符和赋值运算符组合起来使用。让我们来看几个例子:
$a = 13;
$a += 14; // same as $a = $a + 14;
var_dump($a);
$a -= 2; // same as $a = $a - 2;
var_dump($a);
$a *= 4; // same as $a = $a * 4;
var_dump($a);
比较运算符
比较运算符是最常用的运算符之一。它们接受两个操作数并对其进行比较,比较结果通常以布尔形式返回,即返回 true
或 false
。
有四种比较运算非常直观: <
(小于)、<=
(小于或等于)、>
(大于)和 >=
(大于或等于)。还有一种特殊的运算符 <=>
(飞船),它可以比较两个操作数,并返回一个整数而不是布尔值。当比较 a
和 b
时,如果 a
小于 b
,结果将小于 0
;如果 a
等于 b
,结果将为 0
;如果 a
大于 b
,结果将大于 0
:
<?php
var_dump(2 < 3); // true
var_dump(3 < 3); // false
var_dump(3 <= 3); // true
var_dump(4 <= 3); // false
var_dump(2 > 3); // false
var_dump(3 >= 3); // true
var_dump(3 > 3); // false
var_dump(1 <=> 2); // int less than 0
var_dump(1 <=> 1); // 0
var_dump(3 <=> 2); // int greater than 0
有一些比较运算符可以评估两个表达式是否相等,但需要注意类型不同。==
(相等)运算符在对两个表达式进行类型转化后进行求值,也就是说,它会尝试将两个表达式转换为相同的类型,然后再进行比较。相反,===
(相同)运算符在对两个表达式进行求值时不进行类型转化,因此即使它们看起来相同,如果它们不属于同一类型,比较结果将返回 false
。这同样适用于 !=
或 <>
(不等于)和 !==
(不相同):
<?php
$a = 3;
$b = '3';
$c = 5;
var_dump($a == $b); // true
var_dump($a === $b); // false
var_dump($a != $b); // false
var_dump($a !== $b); // true
var_dump($a == $c); // false
var_dump($a <> $c); // true
可以看到,当问及表示相同数字的字符串和整数是否相等时,它的回答是肯定的;PHP 首先将两者转换为相同的类型。另一方面,当问及它们是否相同时,PHP 的回答是不相同,因为它们的类型不同。
逻辑运算符
逻辑运算符对其操作数进行逻辑运算(也称为二进制运算),返回布尔响应。最常用的逻辑运算符是 !(not)
、&&(and)
和 ||(or)
。&&
只有在两个操作数均为真的情况下才会返回 true
。||
将在任何一个操作数为真或两个操作数均为真时返回 true
。 !
将返回操作数的否定值,也就是说,如果操作数为假,则返回 true
;如果操作数为真,则返回 false
。我们来看几个例子:
<?php
var_dump(true && true); // true
var_dump(true && false); // false
var_dump(true || false); // true
var_dump(false || false); // false
var_dump(!false); // true
自增和自减运算符
递增/递减运算符也是像 +=
或 -=
一样的快捷方式,它们只对变量有效。它们有四个,需要特别注意。前两个我们已经看过了:
-
++
: 在变量左边的这个运算符会将变量增加 1,然后返回结果。在右边,它会返回变量的内容,然后再增加 1。 -
--
: 该运算符的作用与++
相同,但会将数值减少 1,而不是增加 1。
让我们来看一个例子:
<?php
$a = 3;
$b = $a++; // $b is 3, $a is 4
var_dump($a, $b);
$b = ++$a; // $a and $b are 5
var_dump($a, $b);
在前面的代码中,对 $b
进行第一次赋值时,我们使用了 $a++
。在第二次赋值中,左边的运算符首先将 $a
增加 1,将 $a
的值改为 5,然后将该值赋值给 $b
。
运算符优先级
您可以在表达式中添加多个运算符,使表达式尽可能长,但需要注意的是,有些运算符的优先级高于其他运算符,因此执行顺序可能与您的预期不同。下表显示了我们迄今为止学习过的运算符的优先顺序:

上表显示,表达式 3+2*3
将首先求积 2*3
,然后求和,因此结果是 9
而不是 15
。如果要按照不同于自然优先顺序的特定顺序执行运算,可以通过将运算括在括号内来强制执行。因此,(3+2)*3
将首先执行和,然后执行积,这次的结果是 15
。
让我们看几个例子来澄清这个相当棘手的问题:
<?php
$a = 1;
$b = 3;
$c = true;
$d = false;
$e = $a + $b > 5 || $c; // true
var_dump($e);
$f = $e == true && !$d; // true
var_dump($f);
$g = ($a + $b) * 2 + 3 * 4; // 20
var_dump($g);
前面的例子可以说是无穷无尽,但仍然无法涵盖你能想象到的所有情况,所以还是简单点吧。在第一行中,我们使用了算术运算符、比较运算符、逻辑运算符和赋值运算符。由于没有括号,其顺序与上表中的顺序相同。优先级最高的运算符是求和运算符,因此我们先执行它:$a + $b
等于 4
。其次是比较运算符,因此 4 > 5
,即 false
。最后是逻辑运算符,false || $c
($c
为 true
)的结果是 true
。
第二个例子可能需要更多解释。我们在表中看到的第一个运算符是否定运算符,因此我们要解决它。!$d
是 !false
,所以是 true
。现在的表达式是:$e == true && true
。首先,我们需要解决 $e == true
的比较问题。由于知道 $e
为 true
,所以比较结果为 true
。最后的操作是逻辑结束,结果是 true
。
试着自己解决最后一个例子,以获得一些练习。如果你觉得我们讲的运算符不够多,也不要害怕。在接下来的几节中,我们将看到大量的示例。