运算符

使用变量固然很好,但如果我们不能让变量之间相互影响,那就无能为力了。运算符(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);

比较运算符

比较运算符是最常用的运算符之一。它们接受两个操作数并对其进行比较,比较结果通常以布尔形式返回,即返回 truefalse

有四种比较运算非常直观: <(小于)、<=(小于或等于)、>(大于)和 >=(大于或等于)。还有一种特殊的运算符 <=>(飞船),它可以比较两个操作数,并返回一个整数而不是布尔值。当比较 ab 时,如果 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

运算符优先级

您可以在表达式中添加多个运算符,使表达式尽可能长,但需要注意的是,有些运算符的优先级高于其他运算符,因此执行顺序可能与您的预期不同。下表显示了我们迄今为止学习过的运算符的优先顺序:

image 2023 11 01 18 33 46 592

上表显示,表达式 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$ctrue)的结果是 true

第二个例子可能需要更多解释。我们在表中看到的第一个运算符是否定运算符,因此我们要解决它。!$d!false,所以是 true。现在的表达式是:$e == true && true。首先,我们需要解决 $e == true 的比较问题。由于知道 $etrue,所以比较结果为 true。最后的操作是逻辑结束,结果是 true

试着自己解决最后一个例子,以获得一些练习。如果你觉得我们讲的运算符不够多,也不要害怕。在接下来的几节中,我们将看到大量的示例。