简单来讲,各种程序语言的运算符类似于数学知识中的运算符号。
按照可以操作几个数值来分类,可以分为三类:一元、二元、三元运算符。
①一元运算符只能接受一个值,例如 !(逻辑取反运算符)或 ++(递增运算符);
②二元运算符可接受两个值,例如熟悉的算术运算符 +(加)和 -(减),大多数 PHP 运算符都是这种;
③最后是唯一的三元运算符 ? :,可接受三个值。
按照功能来分类,可以分为:
算术运算符、赋值运算符、位运算符、比较运算符、错误控制运算符、执行运算符、递增/递减运算符、逻辑运算符、字符串运算符、数组运算符、类型运算符。
1.5.1 PHP 算数运算符
程序的算数运算符和基本数学知识一样。
eg:
运算符 | 示例 | 结果 |
---|---|---|
+ | $a + $b | $a 和 $b 的和。 |
- | $a — $b | $a 和 $b 的差。 |
* | $a * $b | $a 和 $b 的积。 |
/ | $a / $b | $a 除以 $b 的商。 |
% | $a % $b | $a 除以 $b 的余数。 |
注意事项:
①除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。
②取模运算符(%)的操作数在运算之前都会转换成整数(除去小数部分)。
③取模运算符 % 的结果和被除数的符号(正负号)相同。即 $a % $b
的结果和 $a
的符号相同。
④两个数组相加时,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。
eg:
<?php
var_dump(9.8%3.1); //输出0,相当于9%3
echo (5 % 3)."\n"; // 输出2
echo (5 % -3)."\n"; // 输出2
echo (-5 % 3)."\n"; // 输出-2
echo (-5 % -3)."\n"; // 输出-2
1.5.2赋值运算符
基本的赋值运算符是“=”。它实际上意味着把右边表达式的值赋给左边的变量,并不是“等于”,php中等于是“”,“=”。
另外,一些简写的方式如下:
<?php
//左边是简写,相当于右边
$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;
1.5.3位运算符
位运算符允许对整型数中指定的位进行求值和操作。
上面那句话是官方定义,按照个人理解,就是把运算的数,转换成二进制进行相应的计算。操作数在运算之前都会转换成整数(除去小数部分)。
位移在 PHP 中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。
运算符 | 示例 | 结果 |
---|---|---|
& | $a & $b | 将把 $a 和 $b 中都为 1 的位设为 1。 |
\| | $a\|$b | 将把 $a 和 $b 中任何一个为 1 的位设为 1。 |
^ | $a ^ $b | 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 |
~ | ~ $a | 将 $a 中为 0 的位设为 1,反之亦然。 |
<< | $a << $b | 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
>> | $a >> $b | 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
在php中位运算符在编码中并不常用,以下只做“|”和“&”介绍
eg:
<?php
$a = 10;//10的二进制表示为 00000000 00000000 00000000 00001010
$b = 5;//5的二进制表示为 00000000 00000000 00000000 00000101
$c = $a | $b; //$c的值为15,如下
/*
00000000 00000000 00000000 00001010($a)
00000000 00000000 00000000 00000101($b)
---------------------------------------
00000000 00000000 00000000 00001111($c)
*/
下面介绍“&&”、“||”和“&”、“|”的区别
逻辑运算符在编码过程中是必不可少的。“&&”与“||”在判断时,存在短路问题,"&"与“|”则不存在。
eg:
<?php
//以下示例是以“&&”和“&”为例,“||”和“|”类似
$a = 1;
$b = false;
//if判断中,由于$b已经是false了,发生短路,程序就没有计算$a++,直接进入else
if($b && $a++){
echo 1 ."<br>";
}else{
echo 2 ."<br>";
}
echo $a ."<br>";//输出1
//这里程序不管$b结果如何,都会对$a++进行计算,再根据结果判断是否进入else
if($b & $a++){
echo 3 ."<br>";
}else{
echo 4 ."<br>";
}
echo $a ."<br>";//输出2
1.5.4比较运算符
对两个值进行比较的运算符。如下:
示例 | 名称 | 结果 |
---|---|---|
$a==$b | 等于 | TRUE,如果类型转换后 $a 等于 $b 。比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行,eg:var_dump(1 == '1a');//输出true |
$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 ?? $c | NULL 合并操作符 | 从左往右第一个存在且不为 NULL 的操作数。如果都没有定义且不为 NULL,则返回 NULL。PHP7开始提供。 |
$a <=> $b | 太空船运算符(组合比较符) | TRUE,如果 $a 大于或者等于 $b 。 |
多种类型比较转换参考如下:
运算数 1 类型 | 运算数 2 类型 | 结果 |
---|---|---|
null 或 string | string | 将 NULL 转换为 “”,进行数字或词汇比较 |
bool 或 null | 任何其它类型 | 转换为 bool,FALSE < TRUE |
object | object | 内置类可以定义自己的比较,不同类不能比较,具体参考http://php.net/manual/zh/language.oop5.object-comparison.php |
string,resource 或 number | string,resource 或 number | 将字符串和资源转换成数字,按普通数学比较 |
array | array | 具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,此时总是返回false,否则挨个值比较 |
object | 任何其它类型 | object 总是更大 |
array | 任何其它类型 | 除了object,array总是更大 |
1.5.5递增/递减运算符
注意:
1、 递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是 1。
2、字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化。
例子 | 效果 |
---|---|
++$a | $a 的值加一,然后返回 $a 。 |
--$a | $a 的值减一, 然后返回 $a 。 |
$a++ | 先返回 $a ,然后将 $a 的值加一。 |
$a-- | 先返回 $a ,然后将 $a 的值减一。 |
eg:
<?php
$d = 'Z8';
$e = 'Z8';
for ($n=0; $n<20; $n++) {
echo ++$d . '<br>';
}//输出Z9 AA0 AA1 AA2 AA3 AA4 AA5 AA6 AA7 AA8 AA9 AB0 AB1 AB2 AB3 AB4 AB5 AB6 AB7 AB8
for ($n=0; $n<20; $n++) {
echo $e++ . '<br>';
}//输出Z8 Z9 AA0 AA1 AA2 AA3 AA4 AA5 AA6 AA7 AA8 AA9 AB0 AB1 AB2 AB3 AB4 AB5 AB6 AB7
1.5.6逻辑运算符
运算符 | 描述 | 说明 | 示例 |
---|---|---|---|
and 或&& | 逻辑与 | 左右两边都为TRUE时,返回true,否则返回false | $a && $b $a and $b |
or 或\|\| | 逻辑或 | 两边操作数都为false时返回false否则返回true | $a \|\| $b $a or $b |
! 或not | 逻辑非 | 取反 | not $a !$a |
xor | 逻辑异或 | 当两边操作数结果不同时,返回true,否则返回false | $a xor $b |
优先级问题:
“||” 比 “or” 的优先级高
eg:
<?php
// 表达式 (false || true) 的结果被赋给$e
// 等同于:($e = (false || true))
$e = false || true;
// 常量 false 被赋给 $f,true 被忽略
// 等同于:(($f = false) or true)
$f = false or true;
var_dump($e, $f);//输出true false
// --------------------
// "&&" 比 "and" 的优先级高
// 表达式 (true && false) 的结果被赋给 $g
// 等同于:($g = (true && false))
$g = true && false;
// 常量 true 被赋给 $h,false 被忽略
// 等同于:(($h = true) and false)
$h = true and false;
var_dump($g, $h);//输出false true
1.5.7其他运算符
①错误运算符@
当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 foreach 等。
eg:
<?php
/**
*下边表达式涉及到几个知识点,
*如果@file ('non_existent_file')为true,那么or后边的就不会执行,这个是||短路,
*优先级问题,下边表达式相当于($my_file = @file ('non_existent_file')) or die ("Failed opening file: error was '$php_errormsg'");
*/
$my_file = @file ('non_existent_file') or die ("Failed opening file: error was '$php_errormsg'");
②执行运算符
PHP 支持一个执行运算符:反引号(` `)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同。
注意事项:
1)反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。
2)与其它某些语言不同,反引号不能在双引号字符串中使用。
eg:
<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>
③字符串运算符
相当于链接符,有两个字符串(string)运算符。第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(“.=”)
eg:
<?php
$a = "Hello ";
$b = $a . "World!"; // now $b contains "Hello World!"
$a = "Hello ";
$a .= "World!"; // now $a contains "Hello World!"
④类型运算符 instanceof
可以参考:http://php.net/manual/zh/language.operators.type.php
1.5.8运算符优先级
参考表:http://php.net/manual/zh/language.operators.precedence.php