在 PHP 编程教程的这一部分中,我们讨论 PHP 运算符。
运算符是特殊符号,表示已执行某个过程。 编程语言的运算符来自数学。 程序员处理数据。 运算符用于处理数据。
PHP 运算符类型
我们有几种类型的运算符:
- 算术运算符
- 布尔运算符
- 关系运算符
- 按位运算符
一个运算符可以有一个或两个操作数。 操作数是运算符的输入(参数)之一。 仅使用一个操作数的那些运算符称为一元运算符。 那些使用两个操作数的对象称为二进制运算符。
+和-可以是加减运算符,也可以是一元符号运算符。 这取决于实际情况。
php> print +2;2php> print -2;-2php> print 2;2php> print 2+2;4php> print 2-2;0
加号可用于表示我们有一个正数,但通常不使用它。 减号更改值的符号。
php> $a = 1;php> print -$a;-1php> print -(-$a);1
乘法和加法运算符是二进制运算符的示例。 它们与两个操作数一起使用。
php> print 3 * 3;9php> 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.php33 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.php2 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;0php> print 'apples' - 'oranges';0php> 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.phpbool(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.phpbool(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.phpbool(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
<?phpecho 'a' < 'b';echo "\n";echo 'a is:', ord('a');echo "\n";echo 'b is:', ord('b');echo "\n";
在内部,a和b字符是数字。 因此,当我们比较两个字符时,我们将比较它们的存储数字。 内置的ord()函数返回单个字符的 ASCII 值。
$ php compare.php1a is:97b 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;-8php> print ~-8;7
运算符恢复数字 7 的所有位。这些位之一还确定数字是否为负。 如果我们再一次对所有位取反,我们将再次得到 7。
按位,运算符在两个数字之间进行逐位比较。 仅当操作数中的两个对应位均为 1 时,位位置的结果才为 1。
00110& 00011= 00010
第一个数字是二进制符号 6,第二个数字是 3,结果是 2。
php> print 6 & 3;2php> 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 powernumber >> 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;2php> $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
<?phpprint 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.php2840bool(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 1php> echo @ (3 / 0);php>
在第一种情况下,我们收到除以零的错误消息。 在第二种情况下,@运算符将关闭错误消息。
引用(&)运算符。 它创建对对象的引用。
php> $a = 12;php> $b = &$a;php> echo $b;12php> $b = 24;php> echo $b;24php> echo $a;24
在上面的示例中,我们将值传递给$a变量,并将对$a的引用传递给$b变量。
php> $b = &$a;
我们创建一个指向$a变量的新变量$b。 换句话说,我们为$a变量创建一个别名。
php> $b = 24;php> echo $b;24php> 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 运算符。
