原文: https://zetcode.com/lang/php/operators/

在 PHP 编程教程的这一部分中,我们讨论 PHP 运算符。

运算符是特殊符号,表示已执行某个过程。 编程语言的运算符来自数学。 程序员处理数据。 运算符用于处理数据。

PHP 运算符类型

我们有几种类型的运算符:

  • 算术运算符
  • 布尔运算符
  • 关系运算符
  • 按位运算符

一个运算符可以有一个或两个操作数。 操作数是运算符的输入(参数)之一。 仅使用一个操作数的那些运算符称为一元运算符。 那些使用两个操作数的对象称为二进制运算符。

+和-可以是加减运算符,也可以是一元符号运算符。 这取决于实际情况。

  1. php> print +2;
  2. 2
  3. php> print -2;
  4. -2
  5. php> print 2;
  6. 2
  7. php> print 2+2;
  8. 4
  9. php> print 2-2;
  10. 0

加号可用于表示我们有一个正数,但通常不使用它。 减号更改值的符号。

  1. php> $a = 1;
  2. php> print -$a;
  3. -1
  4. php> print -(-$a);
  5. 1

乘法和加法运算符是二进制运算符的示例。 它们与两个操作数一起使用。

  1. php> print 3 * 3;
  2. 9
  3. php> print 3 + 3;
  4. 6

PHP 赋值运算符

赋值运算符=将值赋给变量。 variable是值的占位符。 在 PHP 中,变量以$字符开头。 (在数学上,=运算符具有不同的含义。在一个方程式中,=运算符是一个相等运算符。该方程式的左侧等于右侧的等式。)

  1. php> $x = 1;
  2. php> print $x;
  3. 1

在这里,我们为$x变量分配一个数字。

  1. php> $x = $x + 1;
  2. php> print $x;
  3. 2

先前的表达式在数学上没有意义,但是在编程中是合法的。 该表达式意味着我们向$x变量加 1。 右边等于 2,并且 2 分配给$x

  1. php> 3 = $x;
  2. Parse error: syntax error, unexpected '=' in php shell code on line 1

此代码示例导致语法错误。 我们无法为字面值分配值。

PHP 算术运算符

下表是 PHP 中的算术运算符表。

符号 名称
+ 加法
- 减法
* 乘法
/ 除法
% 模数

以下示例显示了算术运算。

arithmetic.php

  1. <?php
  2. $a = 10;
  3. $b = 11;
  4. $c = 12;
  5. $add = $a + $b + $c;
  6. $sub = $c - $a;
  7. $mult = $a * $b;
  8. $div = $c / 3;
  9. echo "$add $sub $mult $div\n";

所有这些都是数学上已知的运算符。

  1. $ php arithmetic.php
  2. 33 2 110 4

%运算符称为模运算符。 它找到一个数除以另一个的余数。

  1. php> print 9 % 4;
  2. 1

9 % 4,9 模 4 为 1,因为 4 两次进入 9 且余数为 1。

PHP 计算素数

质数是大于 1 的整数,只能被 1 或本身平均除。

primes.php

  1. <?php
  2. $nums = range(0, 100, 1);
  3. foreach ($nums as $n) {
  4. if ($n <= 1) continue;
  5. if ($n == 2 or $n == 3) {
  6. echo "$n ";
  7. continue;
  8. }
  9. $i = (int) sqrt($n);
  10. $isPrime = true;
  11. while ($i > 1) {
  12. if ($n % $i == 0) {
  13. $isPrime = False;
  14. }
  15. $i--;
  16. }
  17. if ($isPrime == True) {
  18. echo "$n ";
  19. }
  20. }
  21. echo "\n";

模运算符用于计算素数。 计算素数的算法是这样的:我们选取一个数字并将其除以数字,从 1 到选取的数字。 已经证明,我们不需要尝试所有较小的数字。 尝试数字直到所选数字的平方根就足够了。

  1. $nums = range(0, 100, 1);

我们使用range()函数创建一个从 0 到 100 的整数数组。

  1. if ($n <= 1) continue;

根据定义,素数是大于 1 的数; 因此,我们跳过计算并继续下一个数字。

  1. if ($n == 2 or $n == 3) {
  2. echo "$n ";
  3. continue;
  4. }

数字 2 和 3 是质数。

  1. $i = (int) sqrt($n);

如果我们仅尝试小于数字平方根的数字,那就可以了。

  1. while ($i > 1) {
  2. ...
  3. }

使用while循环。 $i是计算出的数字的平方根。 我们使用减量运算符将每个循环周期的$i减 1。 当$i小于 1 时,我们终止循环。 例如,我们有 9。9 的平方根是 3。我们将 9 除以 3 和 2。

  1. if ($n % $i == 0) {
  2. $isPrime = False;
  3. }

这是算法的核心。 如果对于任何$i值,余数除法运算符返回 0,则说明的数字不是质数。

  1. $ php primes.php
  2. 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

这些是 0 到 100 之间的质数。

PHP 连接字符串

我们使用点.运算符来连接字符串。

  1. php> print 'return' . 'of' . 'the' . 'king';
  2. returnoftheking

点运算符从四个字符串中得出一个字符串。

  1. php> print 3 . 'apples';
  2. 3apples

我们可以使用点运算符将字符串与数字连接起来。 在内部,数字将转换为字符串,最后将两个字符串连接在一起。

  1. php> print 'apples' * 3;
  2. 0
  3. php> print 'apples' - 'oranges';
  4. 0
  5. php> print 'apples' + 'oranges';
  6. 0

对字符串使用其他运算符没有多大意义; 我们得到零。

  1. php> print (Integer) 'apple';
  2. 0

这是因为在数字上下文中,字符串等于零。

PHP 布尔运算符

在 PHP 中,我们有andor和否定!布尔运算符。 使用布尔运算符,我们可以执行逻辑运算。 这些常与ifwhile关键字一起使用。

andop.php

  1. <?php
  2. $a = (True and True);
  3. $b = (True and False);
  4. $c = (False and True);
  5. $d = (False and False);
  6. var_dump($a, $b, $c, $d);

此示例显示了逻辑and运算符。 仅当两个操作数均为True时,逻辑和运算符才求值为True

  1. $ php andop.php
  2. bool(true)
  3. bool(false)
  4. bool(false)
  5. bool(false)

如果两个操作数中的任何一个为True,则逻辑or运算符的计算结果为True

orop.php

  1. <?php
  2. $a = (True or True);
  3. $b = (True or False);
  4. $c = (False or True);
  5. $d = (False or False);
  6. var_dump($a, $b, $c, $d);

如果运算符的任一侧为True,则运算结果为True

  1. $ php orop.php
  2. bool(true)
  3. bool(true)
  4. bool(true)
  5. bool(false)

否定运算符!设为True FalseFalse True

negation.php

  1. <?php
  2. $a = ! False;
  3. $b = ! True;
  4. $c = ! (4<3);
  5. var_dump($a, $b, $c);

该示例显示了否定运算符的作用。

  1. $ php negation.php
  2. bool(true)
  3. bool(false)
  4. bool(true)

并且,或者对短路进行了求值。 短路求值意味着仅当第一个参数不足以确定表达式的值时,才求值第二个参数:当和的第一个参数求值为false时,总值必须为false; 当或的第一个参数为true时,总值必须为true

一个典型的例子如下。

shortcircuit.php

  1. <?php
  2. $x = 10;
  3. $y = 0;
  4. if ($y != 0 and x/y < 100) {
  5. echo "a small value";
  6. }

表达式的第一部分计算为False。 表达式的第二部分不计算。 否则,我们将得到除以零的错误。

PHP 关系运算符

关系运算符用于比较值。 这些运算符总是产生布尔值。

符号 含义
< 小于
<= 小于或等于
> 大于
>= 大于或等于
== 等于
!=<> 不等于
=== 相同
!== 不相同

该表显示了八个 PHP 关系运算符。

  1. php> var_dump(3 < 4);
  2. bool(true)
  3. php> var_dump(3 == 4);
  4. bool(false)
  5. php> var_dump(4 >= 3);
  6. bool(true)

正如我们已经提到的,关系运算符返回布尔值。

注意,关系运算符不限于数字。 我们也可以将它们用于其他对象。 尽管它们可能并不总是有意义的。

  1. php> var_dump("six" == "six");
  2. bool(true)
  3. php> var_dump("a" > 6);
  4. bool(false)
  5. php> var_dump('a' < 'b');
  6. bool(true)

我们也可以比较字符串对象。 我们可以将关系运算符用于不同的对象类型。 在我们的例子中,我们将字符串与数字进行比较。

  1. php> var_dump('a' < 'b');

这里到底发生了什么? 计算机不知道字符或字符串。 对于他们来说,一切都只是数字。 字符是存储在特定表中的特殊数字,例如 ASCII。 因此,最后,将比较两个 ASCII 数字。 由于 a 在 b 之前,因此它的数字较小,因此该操作返回true

compare.php

  1. <?php
  2. echo 'a' < 'b';
  3. echo "\n";
  4. echo 'a is:', ord('a');
  5. echo "\n";
  6. echo 'b is:', ord('b');
  7. echo "\n";

在内部,ab字符是数字。 因此,当我们比较两个字符时,我们将比较它们的存储数字。 内置的ord()函数返回单个字符的 ASCII 值。

  1. $ php compare.php
  2. 1
  3. a is:97
  4. b is:98

实际上,我们比较两个数字:97 与 98。

  1. php> print "ab" > "aa";
  2. 1

假设我们有一个包含更多字符的字符串。 如果前几个字符相等,则比较下一个字符。 在我们的情况下,第二个位置的b字符的值比a字符大。 这就是为什么"ab"字符串大于"aa"字符串的原因。 当然,以这种方式比较字符串没有多大意义。 但这在技术上是可能的。

PHP 赋值,相等和身份

您可能会注意到,有一个符号运算符=,两个符号运算符==和三个符号===运算符。 现在我们将讨论这些运算符之间的区别。

一个符号=运算符是赋值运算符。 它将值加载到变量。

  1. php > $a = 6;
  2. php > echo $a;
  3. 6

在示例中,我们为$a变量分配值 6。 $a变量现在包含数字 6。 我们可以使用echo命令显示$a变量的内容。

两个符号==运算符是宽松相等运算符。 它用于测试所讨论的值是否相等。 请注意,使用此运算符时,PHP 解释器会进行一些隐式转换。 这导致一些非直觉的结果。

  1. php> var_dump(false == 0);
  2. bool(true)
  3. php> var_dump(false == array());
  4. bool(true)
  5. php> var_dump(true == 1);
  6. bool(true)
  7. php> var_dump(true == "string");
  8. bool(true)
  9. php> var_dump(117 == "000117");
  10. bool(true)

对于许多来自其他语言的程序员,初学者或程序员来说,这些结果可能令人惊讶。 如果将数字与字符串进行比较,或者比较涉及数字字符串,则每个字符串都将转换为数字,然后以数字方式进行比较。

三个符号===运算符是严格比较运算符。 它称为身份运算符。 仅当操作数的值相同且类型相同时,此运算符才返回true

  1. php> var_dump(false === 0);
  2. bool(false)
  3. php> var_dump(false === array());
  4. bool(false)
  5. php> var_dump(true === 1);
  6. bool(false)
  7. php> var_dump(true === "string");
  8. bool(false)
  9. php> var_dump(117 === "000117");
  10. bool(false)

如我们所见,身份运算符返回相反的结果。 该运算符更直观,使用更安全。

PHP 按位运算符

小数对人类是自然的。 二进制数是计算机固有的。 二进制,八进制,十进制或十六进制符号仅是数字符号。 按位运算符使用二进制数的位。 我们还有二进制逻辑运算符和移位运算符。

很少在高级语言(如 PHP)中使用按位运算符。

符号 含义
~ 按位取反
^ 按位异或
& 按位与
` ` 按位或
<< 左移
>> 右移

按位取反运算符分别将 1 更改为 0,将 0 更改为 1。

  1. php> print ~7;
  2. -8
  3. php> print ~-8;
  4. 7

运算符恢复数字 7 的所有位。这些位之一还确定数字是否为负。 如果我们再一次对所有位取反,我们将再次得到 7。

按位,运算符在两个数字之间进行逐位比较。 仅当操作数中的两个对应位均为 1 时,位位置的结果才为 1。

  1. 00110
  2. & 00011
  3. = 00010

第一个数字是二进制符号 6,第二个数字是 3,结果是 2。

  1. php> print 6 & 3;
  2. 2
  3. php> print 3 & 6;
  4. 2

按位或运算符在两个数字之间进行逐位比较。 如果操作数中的任何对应位为 1,则位位置的结果为 1。

  1. 00110
  2. | 00011
  3. = 00111

结果为00110或十进制 7。

  1. php> print 6 | 3;
  2. 7

按位互斥或运算符在两个数字键之间执行逐位比较。 如果操作数中对应位中的一个或另一个(但不是全部)为 1,则位位置的结果为 1。

  1. 00110
  2. ^ 00011
  3. = 00101

结果为00101或十进制 5。

  1. php> print 6 ^ 3;
  2. 5

最后,我们还有按位移位运算符。 按位移位运算符向右或向左移位。

  1. number << n : multiply number 2 to the nth power
  2. number >> n : divide number by 2 to the nth power

这些运算符也称为算术移位。

  1. 00110
  2. >> 00001
  3. = 00011

我们将数字 6 的每个位向右移动。 等于将 6 除以 2。结果为00011或十进制 3。

  1. php> print 6 >> 1;
  2. 3
  1. 00110
  2. << 00001
  3. = 01100

我们将数字 6 的每个位向左移动。 等于将数字 6 乘以 2。结果为01100或十进制 12。

  1. php> print 6 << 1;
  2. 12

PHP 复合赋值运算符

复合赋值运算符由两个运算符组成。 他们是速记员。

  1. php> $i = 1;
  2. php> $i = $i + 1;
  3. php> print $i;
  4. 2
  5. php> $i += 1;
  6. php> print $i;
  7. 3

+=复合运算符是这些速记运算符之一。 它们比完整的表达式可读性差,但是经验丰富的程序员经常使用它们。

其他复合运算符是:

  1. -= *= .= /= %= &= |= ^= >>= <<=

PHP 运算符优先级

运算符优先级告诉我们首先求值哪个运算符。 优先级对于避免表达式中的歧义是必要的。

以下表达式 28 或 40 的结果是什么?

  1. 3 + 5 * 5

像数学中一样,乘法运算符的优先级高于加法运算符。 结果是 28。

  1. (3 + 5) * 5

要更改求值顺序,可以使用方括号。 方括号内的表达式始终首先被求值。

以下列表显示了按优先级排序的常见 PHP 运算符(优先级最高):

运算符 描述
++ -- 增减
(int) (float) (string) (array) (object) (bool) 转型
! 逻辑非
* / % 算术
+ - . 算术和字符串
<< >> 按位
< <= > >= <> 比较
== != === !== 比较
&& 逻辑“与”
` ` 逻辑或
? : 三元运算符
= += -= *= /= .= %= 赋值
and 逻辑与
xor 逻辑异或
or 逻辑或
, 逗号运算符

列表中同一行上的运算符具有相同的优先级。

precedence.php

  1. <?php
  2. print 3 + 5 * 5;
  3. print "\n";
  4. print (3 + 5) * 5;
  5. print "\n";
  6. var_dump(! True or True);
  7. var_dump(! (True or True));

在此代码示例中,我们显示一些常见的表达式。 每个表达式的结果取决于优先级。

  1. var_dump(! True or True);

在这种情况下,否定运算符具有更高的优先级。 首先,将第一个True值取反为False,然后 OR 运算符组合FalseTrue,最后得到True

  1. $ php precedence.php
  2. 28
  3. 40
  4. bool(true)
  5. bool(false)

关系运算符的优先级高于逻辑运算符。

positive.php

  1. <?php
  2. $a = 1;
  3. $b = 2;
  4. if ($a > 0 and $b > 0) {
  5. echo "\$a and \$b are positive integers\n";
  6. }

和运算符等待两个布尔值。 如果其中一个操作数不是布尔值,则会出现语法错误。

  1. $ php positive.php
  2. $a and $b are positive integers

PHP 关联规则

有时,优先级不能令人满意地确定表达式的结果。 还有另一个规则称为关联性。 运算符的关联性确定优先级与相同的运算符的求值顺序。

  1. 9 / 3 * 3

此表达式的结果是 9 还是 1? 乘法,删除和模运算符从左到右关联。 因此,该表达式的计算方式为:(9 / 3) * 3,结果为 9。

算术,布尔,关系和按位运算符都是从左到右关联的。

另一方面,赋值运算符是正确关联的。

  1. php> $a = $b = $c = $d = 0;
  2. php> echo $a, $b, $c, $d;
  3. 0000

如果关联从左到右,则以前的表达式将不可能。

复合赋值运算符从右到左关联。

  1. php> $j = 0;
  2. php> $j *= 3 + 1;
  3. php> print $j;
  4. 0

您可能期望结果为 1,但是由于关联性,实际结果为 0。 首先求值右边的表达式,然后应用复合赋值运算符。

PHP 中的其他运算符

PHP 具有沉默(@)运算符。 它用于关闭错误消息。 它通常与网络或数据库连接一起使用。 请谨慎使用此运算符,因为它可能导致调试问题。

  1. php> echo 3 / 0;
  2. Warning: Division by zero in php shell code on line 1
  3. php> echo @ (3 / 0);
  4. php>

在第一种情况下,我们收到除以零的错误消息。 在第二种情况下,@运算符将关闭错误消息。

引用(&)运算符。 它创建对对象的引用。

  1. php> $a = 12;
  2. php> $b = &$a;
  3. php> echo $b;
  4. 12
  5. php> $b = 24;
  6. php> echo $b;
  7. 24
  8. php> echo $a;
  9. 24

在上面的示例中,我们将值传递给$a变量,并将对$a的引用传递给$b变量。

  1. php> $b = &$a;

我们创建一个指向$a变量的新变量$b。 换句话说,我们为$a变量创建一个别名。

  1. php> $b = 24;
  2. php> echo $b;
  3. 24
  4. php> echo $a;
  5. 24

$b分配新值也会影响$a

反引号()运算符用于执行命令。 它与shell_exec()`函数调用相同。

  1. php> $list = `ls -l | head -3`;
  2. php> echo $list;
  3. total 52
  4. -rw-rw-r-- 1 janbodnar janbodnar 130 Jan 19 11:35 andop.php
  5. -rw-rw-r-- 1 janbodnar janbodnar 140 Jan 19 11:21 arithmetic.php

我们执行ls命令,该命令在 Unix 系统上列出当前目录的内容。

在 PHP 教程的这一部分中,我们介绍了 PHP 运算符。