# PHP 运算符

> 原文： [https://zetcode.com/lang/php/operators/](https://zetcode.com/lang/php/operators/)

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

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

## PHP 运算符类型

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

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

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

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

```php
php> print +2;
2
php> print -2;
-2
php> print 2;
2
php> print 2+2;
4
php> print 2-2;
0

```

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

```php
php> $a = 1;
php> print -$a;
-1
php> print -(-$a);
1

```

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

```php
php> print 3 * 3;
9
php> print 3 + 3;
6

```

## PHP 赋值运算符

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

```php
php> $x = 1;
php> print $x;
1

```

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

```php
php> $x = $x + 1;
php> print $x;
2

```

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

```php
php> 3 = $x;

Parse error: syntax error, unexpected '=' in php shell code on line 1

```

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

## PHP 算术运算符

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

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

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

`arithmetic.php`

```php
<?php

$a = 10;
$b = 11;
$c = 12;

$add = $a + $b + $c;
$sub = $c - $a;
$mult = $a * $b;
$div = $c / 3;

echo "$add $sub $mult $div\n";

```

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

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

```

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

```php
php> print 9 % 4;
1

```

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

## PHP 计算素数

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

`primes.php`

```php
<?php

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

foreach ($nums as $n) {

    if ($n <= 1) continue;

    if ($n == 2 or $n == 3) {

        echo "$n ";
        continue;
    }

    $i = (int) sqrt($n);
    $isPrime = true;

    while ($i > 1) { 

        if ($n % $i == 0) {

            $isPrime = False;
        } 

        $i--;
    }

    if ($isPrime == True) {
         echo "$n ";
    }
}

echo "\n";  

```

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

```php
$nums = range(0, 100, 1);

```

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

```php
if ($n <= 1) continue;

```

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

```php
if ($n == 2 or $n == 3) {

    echo "$n ";
    continue;
}

```

数字 2 和 3 是质数。

```php
$i = (int) sqrt($n);

```

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

```php
while ($i > 1) { 
...
}

```

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

```php
if ($n % $i == 0) {

    $isPrime = False;
} 

```

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

```php
$ php primes.php 
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 连接字符串

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

```php
php> print 'return' . 'of' . 'the' . 'king';
returnoftheking

```

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

```php
php> print 3 . 'apples';
3apples

```

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

```php
php> print 'apples' * 3;
0
php> print 'apples' - 'oranges';
0
php> print 'apples' + 'oranges';
0

```

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

```php
php> print (Integer) 'apple';
0

```

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

## PHP 布尔运算符

在 PHP 中，我们有`and`，`or`和否定`!`布尔运算符。 使用布尔运算符，我们可以执行逻辑运算。 这些常与`if`和`while`关键字一起使用。

`andop.php`

```php
<?php

$a = (True and True);
$b = (True and False);
$c = (False and True);
$d = (False and False);

var_dump($a, $b, $c, $d);

```

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

```php
$ php andop.php 
bool(true)
bool(false)
bool(false)
bool(false)

```

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

`orop.php`

```php
<?php

$a = (True or True);
$b = (True or False);
$c = (False or True);
$d = (False or False);

var_dump($a, $b, $c, $d);

```

如果运算符的任一侧为`True`，则运算结果为`True`。

```php
$ php orop.php 
bool(true)
bool(true)
bool(true)
bool(false)

```

否定运算符`!`设为`True False`和`False True`。

`negation.php`

```php
<?php

$a = ! False;
$b = ! True;
$c = ! (4<3);

var_dump($a, $b, $c);

```

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

```php
$ php negation.php 
bool(true)
bool(false)
bool(true)

```

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

一个典型的例子如下。

`shortcircuit.php`

```php
<?php

$x = 10;
$y = 0;

if ($y != 0 and x/y < 100) {
    echo "a small value";
}

```

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

## PHP 关系运算符

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

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

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

```php
php> var_dump(3 < 4);
bool(true)
php> var_dump(3 == 4);
bool(false)
php> var_dump(4 >= 3);
bool(true)

```

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

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

```php
php> var_dump("six" == "six");
bool(true)
php> var_dump("a" > 6);
bool(false)
php> var_dump('a' < 'b');
bool(true)

```

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

```php
php> var_dump('a' < 'b');

```

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

`compare.php`

```php
<?php

echo 'a' < 'b';
echo "\n";

echo 'a is:', ord('a');
echo "\n";
echo 'b is:', ord('b');
echo "\n";

```

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

```php
$ php compare.php 
1
a is:97
b is:98

```

实际上，我们比较两个数字：97 与 98。

```php
php> print "ab" > "aa";
1

```

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

## PHP 赋值，相等和身份

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

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

```php
php > $a = 6;
php > echo $a;
6

```

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

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

```php
php> var_dump(false == 0);
bool(true)
php> var_dump(false == array());
bool(true)
php> var_dump(true == 1);
bool(true)
php> var_dump(true == "string");
bool(true)
php> var_dump(117 == "000117");
bool(true)

```

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

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

```php
php> var_dump(false === 0);
bool(false)
php> var_dump(false === array());
bool(false)
php> var_dump(true === 1);
bool(false)
php> var_dump(true === "string");
bool(false)
php> var_dump(117 === "000117");
bool(false)

```

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

## PHP 按位运算符

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

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

| 符号 | 含义 |
| --- | --- |
| `~` | 按位取反 |
| `^` | 按位异或 |
| `&` | 按位与 |
| <code>&#124;</code> | 按位或 |
| `<<` | 左移 |
| `>>` | 右移 |

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

```php
php> print ~7;
-8
php> print ~-8;
7

```

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

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

```php
     00110
  &  00011
   = 00010

```

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

```php
php> print 6 & 3;
2
php> print 3 & 6;
2

```

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

```php
     00110
  |  00011
   = 00111

```

结果为`00110`或十进制 7。

```php
php> print 6 | 3;
7

```

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

```php
     00110
  ^  00011
   = 00101

```

结果为`00101`或十进制 5。

```php
php> print 6 ^ 3;
5

```

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

```php
number << n : multiply number 2 to the nth power
number >> n : divide number by 2 to the nth power

```

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

```php
     00110
  >> 00001
   = 00011

```

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

```php
php> print 6 >> 1;
3

```

```php
     00110
  << 00001
   = 01100

```

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

```php
php> print 6 << 1;
12

```

## PHP 复合赋值运算符

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

```php
php> $i = 1;
php> $i = $i + 1;
php> print $i;
2
php> $i += 1;
php> print $i;
3

```

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

其他复合运算符是：

```php
-=   *=   .=   /=    %=   &=   |=   ^=   >>=   <<=

```

## PHP 运算符优先级

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

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

```php
3 + 5 * 5

```

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

```php
(3 + 5) * 5

```

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

以下列表显示了按优先级排序的常见 PHP 运算符（优先级最高）：

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

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

`precedence.php`

```php
<?php

print 3 + 5 * 5;
print "\n";
print (3 + 5) * 5;
print "\n";

var_dump(! True or True);
var_dump(! (True or True));

```

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

```php
var_dump(! True or True);

```

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

```php
$ php precedence.php 
28
40
bool(true)
bool(false)

```

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

`positive.php`

```php
<?php

$a = 1;
$b = 2;

if ($a > 0 and $b > 0) {

    echo "\$a and \$b are positive integers\n";
}

```

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

```php
$ php positive.php 
$a and $b are positive integers

```

## PHP 关联规则

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

```php
9 / 3 * 3

```

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

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

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

```php
php> $a = $b = $c = $d = 0;
php> echo $a, $b, $c, $d;
0000

```

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

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

```php
php> $j = 0;
php> $j *= 3 + 1;
php> print $j;
0

```

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

## PHP 中的其他运算符

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

```php
php> echo 3 / 0;

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

```

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

引用（&）运算符。 它创建对对象的引用。

```php
php> $a = 12;
php> $b = &$a;
php> echo $b;
12
php> $b = 24;
php> echo $b;
24
php> echo $a;
24

```

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

```php
php> $b = &$a;

```

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

```php
php> $b = 24;
php> echo $b;
24
php> echo $a;
24

```

为`$b`分配新值也会影响`$a`。

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

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

```

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

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