PHP-PHP中的运算符和运算符优先级

什么是运算符

运算: 由一或多个数值经过变换得到一个新值的过程就是运算
运算:表达式表达式是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 $bAnd(逻辑与)TRUE ,如果 $a 和 $b 都为 TRUE 。
$a && $bAnd(逻辑与)TRUE ,如果 $a 和 $b 都为 TRUE 。
$a or $bOr(逻辑或)TRUE ,如果 $a 或 $b 任一为 TRUE 。
$a || $bOr(逻辑或)TRUE ,如果 $a 或 $b 任一为 TRUE 。
! $aNot(逻辑非)TRUE ,如果 $a 不为 TRUE 。
$a xor $bXor(逻辑异或)TRUE ,$a 和 $b 相同为FALSE,不同为TRUE。
  • “与”和“或”有两种不同形式运算符的原因是它们运算的优先级不同(见运算符优先级)。

位运算符

位运算符允许对整型数中指定的位进行求值和操作。(了解)

例子名称结果
$a & $bAnd(按位与)将把 $a 和 $b 中都为 1 的位设为 1。
$a | $bOr(按位或)将把 $a 和 $b 中任何一个为 1 的位设为 1。
$a ^ $bXor(按位异或)将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
~ $aNot(按位取反)将 $a 中为 0 的位设为 1,反之亦然。
$a << $bShift left(左移)将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
$a >> $bShift 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。
  • 执行运算符 :反引号(``)。
    • PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回。
  • 对象成员访问符号 ->
  • 数组元素访问符号=>
  • 多变量分隔符 ,

运算符优先级

运算符优先级 ,对于优先级不确定的运算,可以添加小括号保证优先级。

优先级结合方向运算符附加信息
1无结合clone、newclone 和 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逻辑运算符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值