跳转至

PHP 运算符

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

在 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> $a = 1;
php> print -$a;
-1
php> print -(-$a);
1

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

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

PHP 赋值运算符

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

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

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

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

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

php> 3 = $x;

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

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

PHP 算术运算符

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

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

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

arithmetic.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 arithmetic.php 
33 2 110 4

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

php> print 9 % 4;
1

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

PHP 计算素数

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

primes.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 到选取的数字。 已经证明,我们不需要尝试所有较小的数字。 尝试数字直到所选数字的平方根就足够了。

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

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

if ($n <= 1) continue;

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

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

    echo "$n ";
    continue;
}

数字 2 和 3 是质数。

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

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

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

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

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

    $isPrime = False;
} 

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

$ 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> print 'return' . 'of' . 'the' . 'king';
returnoftheking

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

php> print 3 . 'apples';
3apples

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

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

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

php> print (Integer) 'apple';
0

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

PHP 布尔运算符

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

andop.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 andop.php 
bool(true)
bool(false)
bool(false)
bool(false)

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

orop.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 orop.php 
bool(true)
bool(true)
bool(true)
bool(false)

否定运算符!设为True FalseFalse True

negation.php

<?php

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

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

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

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

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

一个典型的例子如下。

shortcircuit.php

<?php

$x = 10;
$y = 0;

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

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

PHP 关系运算符

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

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

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

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

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

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

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

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

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

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

compare.php

<?php

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

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

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

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

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

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

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

PHP 赋值,相等和身份

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

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

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

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

两个符号==运算符是宽松相等运算符。 它用于测试所讨论的值是否相等。 请注意,使用此运算符时,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> 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)中使用按位运算符。

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

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

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

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

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

     00110
  &  00011
   = 00010

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

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

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

     00110
  |  00011
   = 00111

结果为00110或十进制 7。

php> print 6 | 3;
7

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

     00110
  ^  00011
   = 00101

结果为00101或十进制 5。

php> print 6 ^ 3;
5

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

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

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

     00110
  >> 00001
   = 00011

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

php> print 6 >> 1;
3

     00110
  << 00001
   = 01100

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

php> print 6 << 1;
12

PHP 复合赋值运算符

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

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

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

其他复合运算符是:

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

PHP 运算符优先级

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

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

3 + 5 * 5

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

(3 + 5) * 5

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

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

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

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

precedence.php

<?php

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

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

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

var_dump(! True or True);

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

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

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

positive.php

<?php

$a = 1;
$b = 2;

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

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

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

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

PHP 关联规则

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

9 / 3 * 3

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

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

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

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

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

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

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

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

PHP 中的其他运算符

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

php> echo 3 / 0;

Warning: Division by zero in php shell code on line 1
php> echo @ (3 / 0);
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> $b = &$a;

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

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

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

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

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 运算符。



回到顶部