多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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 运算符。