• 微信号
目录

php基础

您当前的位置:首页 > 我的笔记 > php基础>php运算符

php运算符

运算符与表达式

在程序中,经常会对数据进行运算,php提供了多种类型的运算符,即专门用于告诉程序执行特定运算或逻辑操作符号。根据运算的作用,可以将php语言中常见的运算符分为九类。

运算符类型 作用
算术运算符 用于处理四则运算
字符串运算符 用于连接字符串
赋值运算符 用于将表达式的值赋给变量
递增或递减运算符 用于自增或自减运算
比较运算符 用于表达式的比较,并返回一个真值或假值
逻辑运算符 用于根据表达式的值返回真值或假值
位运算符 用于处理数据的位运算
错误控制运算符 用于忽略因表达式运算错误而产生的错误信息
instanceof 用于判断一个对象是否是特定类的实例

每一种类型的运算符的作用都不同。运算符是用来操作数据,因此,这些数据也被称作操作数,使用运算符金操作数链接而成的式子称为表达式,表达式具有以下特点:

1. 常量和变量都是表达式,如,常量3.14,变量$a。

2. 每一个表达式都有自己的值,即表达式都有运算符。

算术运算符

算术运算符用于对数值类型的变量及常量进行算数运算。与数学中的加减乘除类似

运算符 运算 范例 结果
+ 正号 +1 1
- 符号 -2 -2
+ 1+2 3
- 2-1 1
* 1*1 1
/ 2/2 1
% 取模(即算术中的求余) 7%5 2

算数运算符比较简单,也容易理解,但在实际运用中还是有很多需要注意的问题:

1. 进行四则混合运算时,运算顺序遵循数学中的先乘除后加减的原则。

2. 当有浮点参与运算时,运算结果类型总是浮点型,如,0.2+0.8的结果是float(1)当整型与整数运算的结果是小数时,其数据类型也是浮点型。

3. 取模运算在程序中广泛运用,例如,判断奇偶数的方法是求去一个数字除以2的余数是1还是0,运算的结果正负取决于被模数(%左边的数)的符号,与右边(%右边的数)的符号无关,如(-5)%3=-2而5%(-3)=2

赋值运算符

赋值运算符的作用是将常量、变量或者表达式的值赋给一个变量。

运算符 运算 范例 结果
= 赋值 $a=1;$b=2; $a=1;$b=2;
+= 加等于 $a=3;$b=2;$a+=$b $a=5;$b=2
-= 减等于 $a=3;$b=2;$a-=$b; $a=1;$b=2;
*= 乘等于 $a=3;$b=2;$a*=$b $a=6;$b=2
/= 除等于 $a=3;$b=2;$a/=$b $a=1.5;$b=2
%= 模等于 $a=3;$b=2;$a%=$b $a=1;$b=2
.= 链接等于 $a='abc';$a.='def'; $a='abcdef'

“=”的作用不是表示相等的关系,而是赋值运算符,即等号右侧的值赋给等号左侧的变量

在赋值运算符使用中,需要注意以下几个问题:

(1) 在php中可以通过一条赋值语句对多个变量进行赋值

<?php
	$a;
	$b;
	$c;
	$a=$b=$c=5;
?>

由于赋值运算符的结合行为“从右到左”,即先将5赋值给变量c,然后把变量c赋给b,最后把变量b赋给变量a,表达式赋值完成。

(2) 特殊赋值运算,如“+=”

<?php
	$a=2;
	$a+=3;
?>

上述代码中,执行代码$a+=3后,a的值为5。表达式的过程为:

①先将a的值和3进行相加

②将相加的结果赋给变量a

所以表达式$a+=3相当于$a=$a+3,先进行相加运算,在进行赋值。“+=、-=、*=、/=、%=”都可以此类推。

(3)“.=”表示对两个字符串进行连接操作,生成一个新的字符串赋值给变量,也称为字符串运算符

<?php
	$a="abc";
	$a.="def";
	echo $a; //结果为$a="abcdef";
?>

递增递减运算符

递增递减运算符可以看做是一种特定形式的符合赋值运算符,它可可以对数字类型变量的值进行加1或减1

在进行自增(++)或自减(--)运算时:

如果运算符(++或--)放在操作数的前面则是先进行自增或自减,再进行其他运算。

如果运算符(++或--)放在操作数的后面则是先进行其他运算在进行自增或自减。

在php语言中,对操作数进行递增递减操作时,操作类型是不确定的,不同类型的操作执行数执行递增或递减时,会有不同的结果。

1. 递增递减数字

当操作数为数字时,每次操作都会将值加1或减1。

运算符 运算 范例 结果
++ 自增(前) $a=2;$b=++$a; $a=3;$b=3;
++ 自增(后) $a=2;$b=$a++; $a=3;$b=2;
-- 自减(前) $a=2;$b=--$a; $a=1;$b=1;
-- 自减(后) $a=2;$b=$a--; $a=1;$b=2;

案例

<?php
	$x=2;
	//输出不同情况下的$x
	echo '<br/>x='.$x++;
	echo '<br/>x='.$x;
	$y=1.6;
	echo '<br/>y='.++$y;
	echo '<br/>y='.$y;
?>

运行结果

递增递减数字运算符

可以看出两次输出的$x的值不同,这是因为在第4行代码中,程序首先返回$x的值。然后进行递增操作,使$x+1,因此第5行的输出结果为3.

两次$y的值相同,因为在第8行,首先程序先将变量$y的值加1,然后将加1后的结果赋给$y,最后输出$y,第9行未对$y进行其他操作,所以$y的值不变。

2.递增递减字符

字php中,只支持纯字母(A-Z和a-z)的递增运算,其他字符递增运算是无效的。如,我们无法对“#”这样的字符进行递增递减操作。

程序输出结果为a、b、aa、AA、abd。这是因为在php中,当对字符进行递减时,该操作是无效的,并且操作数值不变。当z或Z以前的单字符进行操作时,字符会按照英文字母排列顺序递增,字符会向前一位变成aa或AA。同理,当对多个字母组成的字符进行递增操作时,会针对字符串末尾的单个字符进行递增。

需要注意的是,字符变量只能递增,不能递减,并且只支持纯字母。递增或递减对其他字符变量是无效的,原字符串不会变化。

3.递增递减布尔值或null

当操作数为布尔值时,递增递减操作对其不产生影响。

但操作数为null时,递增结果为1,递减结果不受影响

比较运算符

比较运算符用于对两个数值或变量进行比价,其结果是一个布尔值,即true和false。

运算符 运算 范例 结果
== 等于 $x=5;$x==4; FALSE
!= 不等于 $x=5;$x!=4 TRUE
<> 不等于 $x=5;$x<>4 TRUE
=== 恒等 $x=5;$x===5 TRUE
!== 不恒等 $x=5;$x!=='5' TRUE
> 大于 $x=5;$x>5 FALSE
>= 大于或等于 $x=5;$x>=5 TRUE
< 小于 $x=5;$x<5 fasle
<= 小于或等于 $x=5;$x<=5 TRUE

其中“===”和“!==”比较符是比较少见的。

当$x===$y为true时,说明x,y不只数值相等,而且两者的类型也一样。

当$x!==$y为true时,说明x,y要么数值不相等,要么数据类型不相等。

逻辑运算符

逻辑运算符用于对布尔类型的数据进行操作,其结果仍是一个布尔型。

运算符 运算 范例 结果
&& $a && $b $a和$b都为true,结果为true,否则为false
|| $a || $b $a和$b中至少有一个为true,结果为true,否则为false
! !$a 若$a为false,结果为true,否则相反
xor 异或 $a xor $b $a和$b的值一个为true,一个为false是,结果为true,否则为false
and $a and $b 与&&相同,但优先级较低
or $a or $b 与||相同,但优先级较低

在实际开发中,逻辑运算法也可以针对结果为布尔值的表达式进行运算。如,$x>3&&$y!=0;

位运算符

位运算符是针对二进制的每一位进行运算的符号,它专门针对数字0和1进行操作。

运算符 运算 例子 结果
& 按位与 $a & $b $a和$b每一位进行“与”操作后的结果
| 按位或 $a | $b $a和$b每一位进行“或”操作后的结果
~ 按位非 ~ $a $a的每一位进行“非”操作后的结果
^ 按位异或 $a ^ $b $a和$b每一位进行“异或”操作后的结果
<< 左移 $a << $b 将$a左移$b次(每一次移动都表示“乘与2”)
>> 右移 $a >> $b 将$a右移移$b次(每一次移动都表示“除与2”)

在PHP中,位运算符既可以对整型类型数据进行计算,还可以对字符进行为运算。

<>1. 当运算符左右参数均为数字时

在对数字进行位运算之前,程序会降所有的操作转换成二进制数,然后在进行逐位运算。

(1)位运算“&”是将参与预算的两个二进制数进行“与”运算,如果两个二进制位都为1,则该位的运算结果为1,否则为0

<?php
	$a=8;
	$b=13;
	$c= $a & $b;
	echo $c; //输出结果为8
	/*
	*如果两个二进制位都为1,则该计算结果为1,否则为0
	*计算过程,8的二进制00001000,13的二进制00001101
	*			00001000
	*		&	00001101
	*	-----------------
	*	结果	00001000
	*	00001000对应值为为8
	*/
?>

(2)位运算符“|”是将参与运算的两个二进制数进行“或”运算,如果二进制上有一个值为1,怎该结果为1,否则为0

<?php
	$a=8;
	$b=13;
	$c= $a | $b;
	echo $c; //输出结果为13
	/*
	*如果二进制上有一个值为1,怎该结果为1,否则为0
	*计算过程,8的二进制00001000,13的二进制00001101
	*			00001000
	*		|	00001101
	*	-----------------
	*	结果	00001101
	*	00001101对应值为为13
	*/
?>

(3)位运算符“~”只针对一个操作数进行操作,如果二进制位是0,则取反值为1,如果是1,则取反值为0

<?php
	$a=8;
	$c= ~$a;
	echo $c; //输出结果为-9
	/*
	*计算过程,8的二进制00001000
	*		~	00001000
	*	-----------------
	*	结果	11110111
	*	11110111对应值为为-9
	*/
?>

(4)位运算符“^”是将参与运算的两个二进制数进行“异或”运算,如果二兼职位相同,则值为0,否则为1

<?php
	$a=8;
	$b=13;
	$c= $a ^ $b;
	echo $c; //输出结果为5
	/*
	*如果二进制上有一个值为1,怎该结果为1,否则为0
	*计算过程,8的二进制00001000,13的二进制00001101
	*			00001000
	*		^	00001101
	*	-----------------
	*	结果	00000101
	*	00000101对应值为为5
	*/
?>

(5)位运算符“<<”就是将操作数所有二进制位向左移动一位,运算时,右边的空位补0,左边移走的部分舍去。

<?php
	$a=8;
	$b=1;
	$c= $a<<$b; //将变量$a向左移动$b位
	echo $c; //输出结果为16
	/*
	*将操作数所有二进制位向左移动一位,运算时,右边的空位补0,左边移走的部分舍去
	*计算过程,8的二进制00001000,
	*			00001000    <<1
	*	-----------------
	*	结果	00010000
	*	00010000对应值为为16
	*/
?>

(6)位运算符“>>”就是将操作数所有二进制位向右移动一位,运算时,左边的空位根据原数的符号补0或者1(原来是负数就补1,是正数就补0)

<?php
	$a=8;
	$b=1;
	$c= $a>>$b; //将变量$a向右移动$b位
	echo $c; //输出结果为4
	/*
	*将操作数所有二进制位向右移动一位,运算时,左边的空位根据原数的符号补0或者1(原来是负数就补1,是正数就补0)
	*计算过程,8的二进制00001000,
	*			00001000    >>1
	*	-----------------
	*	结果	00000100
	*	00000100对应值为为4
	*/
?>
2当左右参数均为字符时

在对字符进行位运算之前,首先将字符转换成对应的ASCLL码(数字),然后对产生的数字进行上述运算,再把运算结果(数字)转换成对应的字符。

如果两个字符串长度不一样,则从两个字符串的起始位置开始计算,之后多余的自动转换为空(视为一样)

下面以字符b和字符d的“或运算”为例

<?php
	$a='b';
	$b='d';
	$c= $a | $b; 
	echo $c; //输出结果为f
	/*
	*b对应的ASCLL码值为66,二进制为01000010
	*d对应的ASCLL码值为68,二进制为01000100
	*		01000010
	*	|	01000100
	*	--------------     
	*结果	01000110
	*01000110 对应值为70,该值对应的ASCLL码表示字符为f
	*/
?>

错误控制运算符

php的错误控制运算符使用@符号来辨识,把它放在一个php表达式之前,将忽略该表达式可能产生的错误。

$a=@4/0;

如未使用错误控制符,代码会产生一个除以0的警告信息,使用@操作后,警告信息不会显示出来。

但需要注意的是,@运算符自对表达式有效。例如可以把它放在变量、函数和include()调用、常量之前,但不能把它放在函数或类的定义之前。

运算符优先级

在对一些比较复杂的表达式进行运算时,首先要明确表达式中所有运算符参与运算的先后顺序,我们把这种顺序称为优先级。

优先级 结合方向 运算符 附加信息
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 逻辑运算符

其中,同一行的是运算符具有相同的优先级,左结合方向表示将统计运算符执行顺序从左向右。右结合方向则表示执行顺序从右向左。

在表达式中,还有一种优先级最高的运算符:圆括号();在表达式外围放置一对圆括号,可以提高括号内部运算符优先级,这样可以避免复杂的运算符优先级法则,让代码更为清楚,并且避免一些错误。

<?php
	$a=5+2*2; //输出结果9
	$b=(5+2)*2; //输出结果14
?>

按照优先级原则,变量$a,乘“*”级别高于加“+”,所以优先计算乘号。变量$b使用圆括号后,会先强制计算括号里的表达式(5+2),然后在计算乘号。

在程序中,表达式可以使用任意多个括号,并且最里层的优先级级别最高。需要注意的是“or”比“||”的优先级低,“and”比“&&”优先级低,在程序开发中,倾向于使用“||”和“&&”运算符,以及使用括号来设定特定的运算符顺序。