PHP学习笔记 PHP基本语法——PHP运算符(你真的都知道么?)

走进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 ?? $bNULL 合并
+=$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 或 stringstringnull 转换为 “”,进行数字或词汇比较
bool 或 null任何其它类型转换为 bool,false < true
objectobject内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的说明
string、resource、int、floatstring、resource、int、float将字符串和资源转换成数字,按普通数学比较
arrayarray具有较少成员的数组较小,如果运算数 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、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逻辑运算符

提示

(。◕ˇ∀ˇ◕)遇见就是缘分,如果觉得对自己有帮助,喜欢的可以收藏或者留下一个谢谢支持。
关注我编程不迷路。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值