走进PHP运算符
是一个命令解释器对一个或多个操作数(变量或数值)执行某种运算的符号,也称操作符。
可以根据操作数的个数分为一元运算符、二元运算符、三元运算符。一元运算符只运算一个值,例如!(逻辑取反运算符)或++(递增运算符)。二元运算符可以运算两个值,PHP 支持的大多数运算符都是这种二元运算符,例如熟悉的算术运算符 +
(加)和 -
(减),而三元运算符只有一个(? :
)。
如果按运算符的不同功能去分类,可以分为算术运算符、赋值运算符、位运算符、比较运算符、错误控制运算符、执行运算符、递增/递减运算符、逻辑运算符、字符串运算符、数组运算符、类型运算符。
具有两个操作数的运算符可以称为双目运算符,具有一个操作数的运算符称为单目运算符。
算术运算符
算术运算符是最常用的符号,就是常见的数学操作符,用来处理简单的算术运算,包括+
加、-
减、*
乘、/
除、%
取余等。
符号 | 例子 | 名称 |
---|---|---|
+ | $a + $b | 加法 |
- | $a - $b | 减法 |
* | $a * $b | 乘法 |
/ | $a / $b | 除法 |
% | $a % $b | 取模(取余) |
++ | ++$a或者$a++ | 累加 |
– | –$a或者$a– | 递减 |
** | $a ** $b | 求幂(PHP5.6) |
注意:
-
特别注意:除号(/)和取余运算符(%)的除数部分不能为0。
-
取模运算符的操作数在运算之前都会转换成整数(除去小数部分),取模运算符
%
的结果和被除数的符号(正负号)相同。<?php echo (5 % 3).'<br/>'; // 2 echo (5 % -3).'<br/>'; // 2
小技巧:使用取模运算可以方便计算年份、以及随机的数不超过某个数的范围。
<?php $num = rand()%10; //随机不超过10的数 echo $nnum;
递增/递减运算符
PHP 支持 C 风格的前/后递增与递减运算符,递增和递减运算符是一元运算符。
符号 | 例子 | 名称 |
---|---|---|
++ | ++$a或者$a++ | (前后)累加 |
– | –$a或者$a– | (前后)递减 |
深入理解:
<?php
$num=$num2=$num3=1;
$num=$num+1; //方式1
$num2+=1; // 方式2
$num3++; // 方式3
var_dump($num,$num2,$num3);
# 结果为 int(2) int(2) int(2)
这三种方式都使变量递增1。最后一种形式使用了递增运算符,首先可以看出它是最简洁的一种。这个运算符的操作不同于前面介绍的其他运算符,因为它直接修改其操作数的值。而另外两种是计算+1后赋值给变量。
递增和递减运算符都可以在变量的前面使用(前缀模式),也可以在变量的后面使用(后缀模式)。这样就决定了变量是先运算后使用,还是先使用再运算,如下实例:
<?php
$a=10;
$b=$a++; // 后缀模式 先计算表达式的值,在进行递增
var_dump($a,$b); //运行结果 11 10; 解释:首先将$a的值赋给$b,然后将$a的值加1。
$a=10;
$b=++$a; // 前缀模式 先进行递增,在计算表达式的值
var_dump($a,$b); // 运行结果 11 11;解释:首先将$a的值加1,然后将$a的值赋给$b。
另外,在处理字符变量的算术运算时,PHP沿袭了Perl的习惯,而非C的。例如,在Perl中'Z'+1将得到'AA';而在C中,'Z'+1将得到 '['(ord('Z') == 90,ord('[') == 91)。注意字符变量只能递增,不能递减,并且只支持纯字母(a~z和A~Z)。递增/递减其他字符变量则无效,原字符串没有变化。
<?php
$s='a';
for ($n=0; $n<56; $n++) {
echo $s++ .'<br/>';
}
注意:
- 递增/递减运算符不影响布尔值。递减
null
值也没有效果,但是递增null
的结果是1
。
字符串运算符
在PHP中字符串运算符(也称为连接运算符)只有一个,是英文的句号(.
),它是一个二元运算符。返回其左右参数连接后的字符串。
<?php
$a = "Hello ";
$b = $a . "World!";
echo $b; // 运行结构 Hello World!
- 这个运算符不仅可以将两个字符串连接起来,变成合并的新字符串;也可以将一个字符串和任何标量数据类型相连接,合并成的都是新的字符串。
赋值运算符
基本的赋值运算符是“=”。它是把其右边表达式的值赋给左边变量,或者说是将原表达式的值复制到新变量中。注意赋值运算将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。
运算符 | 示例 | 等同于 | 操作 |
---|---|---|---|
.= | $a .= $b | $a = $a.$b | 字符串拼接 |
??= | $a ??= $b | $a = $a ?? $b | NULL 合并 |
+= | $a += $b | $a = $a + $b | 加法 |
-= | $a -= $b | $a =$a - $b | 减法 |
*= | $a *= $b | $a =$a * $b | 乘法 |
/= | $a /= $b | $a = $a / $b | 除法 |
%= | $a %= $b | $a = $a % $b | 取模 |
**= | $a **= $b | $a = $a ** $b | 指数 |
&= | $a &= $b | $a = $a & $b | 按位与 |
|= | $a |= $b | $a = $a | $b | 按位或 |
^= | $a ^= $b | $a = $a ^ $b | 按位异或 |
<<= | $a <<= $b | $a = $a << $b | 左移 |
>>= | $a >>= $b | $a = $a >> $b | 右移 |
null合并运算符从PHP7开始提供
比较运算符
比较运算符称作关系运算符,又称作条件运算符,也是一种经常用到的二元运算符,用于对运算符两边的操作数进行比较。比较运算符的结果只能是布尔值,TRUE或者FALSE。比较运算符经常用于if条件和while循环等流程控制语句中,用来判断程序执行的条件。
例子 | 名称 | 结果 |
---|---|---|
$a == $b | 等于 | true ,如果类型转换后 $a 等于 $b 。 |
$a === $b | 全等 | true ,如果 $a 等于 $b ,并且它们的类型也相同。 |
$a != $b | 不等 | true ,如果类型转换后$a 不等于 $b 。 |
$a <> $b | 不等 | true ,如果类型转换后 $a 不等于 $b 。 |
$a !== $b | 不全等 | true ,如果$a 不等于 $b ,或者它们的类型不同。 |
$a < $b | 小与 | true ,如果 $a 严格小于 $b 。 |
$a > $b | 大于 | true ,如果$a 严格大于 $b 。 |
$a <= $b | 小于等于 | true ,如果 $a 小于或者等于 $b 。 |
$a >= $b | 大于等于 | true ,如果 $a 大于或者等于 $b 。 |
$a <=> $b | 太空船运算符(组合比较符) | 当$a小于、等于、大于 $b 时 分别返回-1、0、1。 |
太空船操作符“<=>”,也称为组合比较符,是从PHP 7开始提供的。
对于多种类型,比较运算符根据下表比较(按顺序)。
运算数 1 类型 | 运算数 2 类型 | 结果 |
---|---|---|
null 或 string | string | 将 null 转换为 “”,进行数字或词汇比较 |
bool 或 null | 任何其它类型 | 转换为 bool,false < true |
object | object | 内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的说明 |
string、resource、int、float | string、resource、int、float | 将字符串和资源转换成数字,按普通数学比较 |
array | array | 具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,否则挨个值比较(见下例) |
object | 任何其它类型 | object 总是更大 |
array | 任何其它类型 | array 总是更大 |
由于浮点数 float 的内部表达方式,不应比较两个浮点数float是否相等。
逻辑运算符
种逻辑运算符可以单独使用,也可以在一个表达式中使用多个,还可以将多个不同逻辑运算符混合在一起使用,使用括号来指定优先级。
例子 | 名称 | 结果 |
---|---|---|
$a and $b | 逻辑与 | true ,如果 $a 和 $b 都为 true 。 |
$a or $b | 逻辑或) | true ,如果 $a 或 $b 任一为 true 。 |
$a xor $b | 逻辑异或 | true ,如果 $a 或 $b 任一为 true ,但不同时是。 |
not $a | 逻辑非 | true ,如果 $a 不为 true 。 |
! $a | 逻辑非 | true ,如果 $a 不为 true 。 |
$a && $b | 逻辑与 | true ,如果 $a 和 $b 都为 true 。 |
$a || $b | 逻辑或 | true ,如果 $a 或 $b 任一为 true 。 |
“与”和“或”有两种不同形式运算符的原因是它们运算的优先级不同,&&和||优先级更高。
<?php
// "||" 比 "or" 的优先级高:
$a = false || true; //等于 $a = (false || true) 结果:true
$b = false or true; //等于 ($b = false) or true 结果:false
// "&&" 比 "and" 的优先级高:
$c = true && false; //等同于:$c = (true && false) 结果:false
$d = true and false; //等同于:($d = true) and false 结果:true
// var_dump() 根本没机会被调用,被运算符"短路"了
$e = true || var_dump($a,$b,$c,$d);
// 短路应用 如果逻辑或or”前面的数据库连接不成功,才执行die输出错误信息并退出程序,or同||一样
$link = mysql_ connect ( "localhost", "root", "123456") or die("数据库连接失败!”) ;
位运算符
例子 | 名称 | 结果 |
---|---|---|
$a & $b | 按位与 | 只有参与运算的两位都为1,运算的结果才为1,否则为0 |
$a | $b | 按位或 | 只有参与运算的两位都为0,运算的结果才为0,否则为1 |
$a ^ $b | 按位异或 | 只有参与运算的两位不同,运算的结果才为1,否则为0 |
~ $a | 按位取反 | 将用二进制表示的操作数中的1变成0,0变成1 |
$a << $b | 左移 | 将左边操作数在内存中的二进制数据左移右边操作数指定的位数,右边移空的部分补0 |
$a >> $b | 右移 | 将左边操作数在内存中的二进制数据右移右边操作数指定的位数,左边移空的部分补0 |
位运算时的数据类型为 string/integer,分析时要转换为二进制形式,但在程序中书写及输出结果时仍为string/integer类型。
示例:
<?php
$a = 20;
$b = 30;
$c = $a & $b;
/*
00000000 0000000 00000000 00010100 ($a)
& 00000000 0000000 00000000 00011110 (Sb)
---------------------------------------------
00000000 0000000 00000000 00010100 (Sc)
*/
echo $c; //将二进制000000000000000 00000000 00010100 再转为整数20输出
位运算符可以将boolean类型的值转换为整型再进行按位运算。例如,将TRUE转换为1,再将1转换成对应的二进制位;将FALSE转换为0,再将0转换为对应的二进制位。所以就可以使用位运算符中的按位与“&”和按位或“|”作为逻辑运算符使用。
<?php
var_dump(true && true);
var_dump(true & true);
// 运行结果 bool(true) int(1)
逻辑运算符中的逻辑与“&&”和逻辑或“||”存在短路的问题。位运算符中的按位与“&”和按位或“|”作为逻辑判断时则不存在短路的问题。
错误控制运算符
PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。@ 运算符只对表达式有效。可以把它放在变量,函数和 include 调用,常量,等等之前。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if
和 foreach 等。
PHP程序在遇到一些错误情况时,都会产生一些信息报告,这对于程序调试是非常有用的。尽量根据这些信息报告将遇到的错误解决掉,而不是直接使用“@”将其屏蔽。如果直接屏蔽掉这些警告信息,只是警告信息不会输出给浏览器,而存在的错误并没有解决。
执行运算符
PHP 支持一个执行运算符:反引号(`)。注意这不是单引号,PHP尝试将反引号中的内容作为操作系统命令来执行,并将其输出的信息返回(例如,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符的效果与函数shell_exec()相同。
<?php
$output = `ls -al`; //linux
echo "<pre>$output</pre>";
$output = `dir`; //windows
echo "<pre>$output</pre>";
关闭了 shell_exec()时反引号运算符是无效的。
与其它某些语言不同,反引号不能在双引号字符串中使用。
三元运算符
"? :"可以提供简单的逻辑判断,在PHP中是唯一的三元运算符。
表达式 (expr1) ? (expr2) : (expr3)
在 expr1 求值为 true
时的值为 expr2,在 expr1 求值为 false
时的值为 expr3。
可以省略三元运算符中间那部分。表达式 expr1 ?: expr3
在 expr1 求值为 true
时返回 expr1,否则返回 expr3。
<?php
// 三元运算符的例子
$b = $a ? '存在' : '不存在';
echo $b.'<br/>';
// 以上等同于以下的 if/else 语句
if ($a) {
$b = '存在';
} else {
$b = '不存在';
}
echo $b.'<br/>';
// 省略三元运算符的例子
$b = $a ?: '不存在';
echo $b.'<br/>';
NULL 合并运算符
表达式 (expr1) ?? (expr2)
,当 expr1 为 null
,等同于 expr2,否则为 expr1。
注意,当不存在左侧的值时,此运算符也和 isset()一样不会产生警告。 对于 array 键作用很大。
<?php
// NULL 合并运算符的例子
$b = $a ?? '不存在';
// 以上例子等同于于以下 if/else 语句
if (isset($a) {
$b = '存在';
} else {
$b = '不存在';
}
类型运算符
instanceof
用于确定一个 PHP 变量是否属于某一类 class 的实例:
<?php
class MyClass
{
}
class NotMyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass); // bool(true)
var_dump($a instanceof NotMyClass); //bool(false)
-
instanceof
也可用来确定一个变量是不是继承自某一父类的子类的实例。 -
instanceof
也可用于确定一个变量是不是实现了某个接口的对象的实例
运算符的优先级
从高到低列出了运算符的优先级。同一行中的运算符具有相同的优先级,此时它们的结合方向决定求值顺序。
例如,"-“是左联的,那么 1 - 2 - 3
就等同于 (1 - 2) - 3
并且结果是 -4
. 另外一方面,”="是右联的,所以 $a = $b = $c
等同于 $a = ($b = $c)
。
没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1
在PHP是不合法的。但另外一方面表达式 1 <= 1 == 1
是合法的, 因为 ==
的优先级低于 <=
。
优先级 | 结合方向 | 运算符 | 附加信息 |
---|---|---|---|
1 | 无结合 | clone、new | clone 和 new |
2 | 从右向左 | ** | 算术运算符 |
3 | 从右向左 | ++、--、~、(int)、(float)、(string)、(array)、(object)、(bool)、@ | 类型、递增/递减、错误控制 |
4 | 无结合 | instanceof | 类型 |
5 | 从右向左 | ! | 逻辑运算符 |
6 | 从左向右 | *、/、% | 算术运算符 |
7 | 从左向右 | +、-、. | 算术运算符和字符串运算符 |
8 | 从左向右 | <<、>> | 位运算符 |
9 | 无结合 | <、<=、>、>= | 比较运算符 |
10 | 无结合 | ==、!=、===、!==、<>、<=> | 比较运算符 |
11 | 从左向右 | & | 位运算符和引用 |
12 | 从左向右 | ^ | 位运算符 |
13 | 从左向右 | | | 位运算符 |
14 | 从左向右 | && | 逻辑运算符 |
15 | 从左向右 | || | 逻辑运算符 |
16 | 从右向左 | ?? | null 合并运算符 |
17 | 从左向右 | ? : | 三元运算符 |
18 | 从右向左 | =、+=、-=、*=、**=、/=、.=、%=、&=、\|=、^=、<<=、>>= | 赋值运算符 |
19 | 从左向右 | and | 逻辑运算符 |
20 | 从左向右 | xor | 逻辑运算符 |
21 | 从左向右 | or | 逻辑运算符 |
提示
(。◕ˇ∀ˇ◕)遇见就是缘分,如果觉得对自己有帮助,喜欢的可以收藏或者留下一个赞,谢谢支持。
关注我编程不迷路。