什么是运算符
运算: 由一或多个数值经过变换得到一个新值的过程就是运算。
运算:表达式表达式是PHP最重要的基石。在PHP中,几乎所写的任何东西都是一个表达式。简单却最精确的定义一个表达式的方式就是‘任何有值的东西’。如$a = 1
。
+、 - 、*、 /、%等用于运算的符号,就是运算符。
运算符可按照其能接受几个值来分组。
- 一元运算符只能接受一个值,例如 !(逻辑取反运算符)或 ++(递增运算符)。
- 二元运算符可接受两个值,例如熟悉的算术运算符 +(加)和 -(减),大多数 PHP 运算符都是这种。
- 最后是唯一的三元运算符 ? :,可接受三个值;通常就简单称之为“三元运算符”(尽管称之为条件运算符可能更合适)。
算术运算符
例子 | 名称 | 结果 |
---|---|---|
-$a | 取反 | $a 的负值。 |
$a + $b | 加法 | $a 和 $b 的和。 |
$a - $b | 减法 | $a 和 $b 的差。 |
$a * $b | 乘法 | $a 和 $b 的积。 |
$a / $b | 除法 | $a 除以 $b 的商。 |
$a % $b | 取模 | $a 除以 $b 的余数。 |
$a++ / ++$a | 自增 | 本身加1 |
$a- - / - -$a | 自减 | 本身减1 |
- 除法运算符总是返回浮点数。
- 两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。
- 取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。
- 取模运算符 % 的结果和被除数的符号(正负号)相同。即 $a % $b 的结果和 $a 的符号相同。
- 自增自减运算的注意事项:
- 自增或者自减运算就是在原值的基础上+1或者-1的操作。
- 在进行自增或者自减运算时,运算符可以在变量前,也可以在变量后,但是意义不同。
- 如果自增自减运算符在变量前,表示先将变量进行+1或者-1操作。然后再使用该变量参与运算;如果符号在变量后面,则表示先使用该变量进行运算,然后再将变量+1或者-1。
- 自增自减运算符对布尔值无效,一般也不用于数组、对象、资源等类型,只用于整型和浮点型。
- null可以进行自增运算,不能进行自减运算。
$num = 10;
$result = $num++ + ++$num ;
echo $result;//=> 22
字符串运算符
有两个字符串( string )运算符。
- 第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。
- 第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数之后。
<?php
$a = "Hello " ;
$b = $a . "World!" ; // now $b contains "Hello World!"
$a = "Hello " ;
$a .= "World!" ; // now $a contains "Hello World!"
?>
赋值运算符
- 基本的赋值运算符是“=”,意味着把右边表达式的值赋给左边的运算数。
- 赋值运算表达式的值也就是所赋的值。
- 赋值运算将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。
- 对于数组 array ,对有名字的键赋值是用“=>”运算符。
- 二元算术:数组集合和字符串运算符的“组合运算符”,这样可以在一个表达式中使用它的值并把表达式的结果赋给它。+= 、 .= 。
符号 | 名称 | 结果 |
---|---|---|
= | 普通赋值运算符 | $a=3:把3赋值给$a |
+= | 加法赋值运算符 | $a += 3 <===> $a = $a + 3 |
-= | 减法赋值运算符 | $a -= 3 <===> $a = $a - 3 |
*= | 乘法赋值运算符 | $a*= 3 <===> $a = $a * 3 |
/= | 除法赋值运算符 | $a /= 3 <===> $a = $a / 3 |
%= | 取模赋值运算符 | $a %= 3 <===> $a = $a % 3 |
.= | 连接赋值运算符 | $a .= ‘hello’ <===> $a = $a . ‘hello’ |
引用赋值:PHP 支持引用赋值,使用“$var= &$othervar;”
语法。引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。
比较运算符
例子 | 名称 | 结果 |
---|---|---|
$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 | 不等 | 1,如果类型转换后 $a 不等于 $b 。 |
- 比较运算符允许对两个值进行比较。
- 比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行 ( 也适用于 switch 语句 ) 。
- 当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。
逻辑运算符
例子 | 名称 | 结果 |
---|---|---|
$a and $b | And(逻辑与) | TRUE ,如果 $a 和 $b 都为 TRUE 。 |
$a && $b | And(逻辑与) | TRUE ,如果 $a 和 $b 都为 TRUE 。 |
$a or $b | Or(逻辑或) | TRUE ,如果 $a 或 $b 任一为 TRUE 。 |
$a || $b | Or(逻辑或) | TRUE ,如果 $a 或 $b 任一为 TRUE 。 |
! $a | Not(逻辑非) | TRUE ,如果 $a 不为 TRUE 。 |
$a xor $b | Xor(逻辑异或) | TRUE ,$a 和 $b 相同为FALSE,不同为TRUE。 |
- “与”和“或”有两种不同形式运算符的原因是它们运算的优先级不同(见运算符优先级)。
位运算符
位运算符允许对整型数中指定的位进行求值和操作。(了解)
例子 | 名称 | 结果 |
---|---|---|
$a & $b | And(按位与) | 将把 $a 和 $b 中都为 1 的位设为 1。 |
$a | $b | Or(按位或) | 将把 $a 和 $b 中任何一个为 1 的位设为 1。 |
$a ^ $b | Xor(按位异或) | 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 |
~ $a | Not(按位取反) | 将 $a 中为 0 的位设为 1,反之亦然。 |
$a << $b | Shift left(左移) | 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
$a >> $b | Shift right(右移) | 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
其他运算符
- 错误控制运算符 @ :
- 当将@放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
- @ 运算符只对表达式有效。
- 连接数据库的时候通常会使用@抑制报错。
- 对于屏蔽多行错误无效,尽量少用@符号,效率低。
- 三元运算符 ( ? : )
- 表达式: (expr1) ? (expr2) : (expr3) 在 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。
- PHP>5.3 起,可以省略三元运算符中间部分。
expr1 ?: expr3
:在 expr1 值为 TRUE 时返回 expr1,否则返回 expr3。 - 注意三元运算符是个语句,因此其求值不是变量,而是语句的结果。
- 避免将三元运算符堆积在一起使用。当在一条语句中使用多个三元运算符时会造成 PHP 运算结果不清晰。
- null运算符(PHP7新增特性)
- 可以代替三元运算符: $result= expr1 ?? expr2; 如果设置了expr1 ,就将expr1的值赋值给$result,否则就将expr2的值赋值给$result。
$arr['test'] = null; $b = 2; var_dump($arr['test']??0); // int(0) //可以简写 $str = '哈哈'; $str ??= '你好呀'; // 如果$str设置了值,就用,如果没有就将‘你好呀’赋值给$str。 echo $str; // '哈哈' //低版本会报语法错误。
$str ??= '你好呀';
: 如果$str设置了值,就用,如果没有就将‘你好呀’赋值给$str。- 连续判断:
$result = expr1 ?? expr2 ?? expr3;
如果设置了expr1 ,就将expr1的值赋值给$result,否则,如果设置了expr2,就将expr2的值赋值给$result, 否则就将expr3赋值给$result。
- 可以代替三元运算符: $result= expr1 ?? expr2; 如果设置了expr1 ,就将expr1的值赋值给$result,否则就将expr2的值赋值给$result。
- 执行运算符 :反引号(``)。
- PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回。
- 对象成员访问符号
->
。 - 数组元素访问符号
=>
。 - 多变量分隔符
,
。
运算符优先级
运算符优先级 ,对于优先级不确定的运算,可以添加小括号保证优先级。
优先级 | 结合方向 | 运算符 | 附加信息 |
---|---|---|---|
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 | 逻辑运算符 |