本章我们讨论 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> printx;
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 submult $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 orn == 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 orn == 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 中,我们有and
,or
和否定!
布尔运算符。 使用布尔运算符,我们可以执行逻辑运算。 这些常与 if 和 while 关键字一起使用。
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 False 和 False 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";
在内部,a 和 b 字符是数字。 因此,当我们比较两个字符时,我们将比较它们的存储数字。 内置的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>echoa;
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> printi;
2
php> i += 1;
php> printi;
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 运算符组合 False 和 True,最后得到 True。
$ php precedence.php
28
40
bool(true)
bool(false)
关系运算符的优先级高于逻辑运算符。
positive.php
和运算符等待两个布尔值。 如果其中一个操作数不是布尔值,则会出现语法错误。
$ 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> echob;
12
php> b = 24;
php> echob;
24
php> echo $a;
24
在上面的示例中,我们将值传递给$a
变量,并将对$a
的引用传递给$b
变量。
php> b = &a;
我们创建一个指向$a
变量的新变量$b
。 换句话说,我们为$a
变量创建一个别名。
php> b = 24;
php> echob;
24
php> echo $a;
24
为$b
分配新值也会影响$a
。
反引号( ` )运算符用于执行命令,它与shell_exec()
函数调用相同。
php> list = `ls -l | head -3`;
php> echolist;
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 系统上列出当前目录的内容。