在表达式中,哪个运算符的优先级越高,就先执行哪种运算,相同优先级的运算符,按照从左到右的顺序来执行。可以通过括号来强制改变优先级。
1. 算术运算符
+ - * / %
取模运算符 % 两侧的操作数,在运算之前都会转换成整数(直接除去小数部分)。
2. 赋值运算符
=
3. 位运算符
& | ^ ~ << >>
4. 比较运算符
<:小于
>:大于
<=:小于等于
>=:大于等于
==:等于,只要值相等,就为true。 如:var_dump('a'==0);
===:全等于,只有值相等且类型相同,才为true。 如:var_dump(0===0);
!=:不等于,只要值不相等,就为true。
<>:不等于,只要值不相等,就为true。
!==:不全等于,值不相等或者类型不同时,就为true。
PHP中,值的比较,遵循以下规则:
如果比较运算符的两侧分别是字符串和数字,则会把字符串转换为数值后,再来比较值。
如果比较运算符的一侧有布尔值,则会把另一侧的值也转换为布尔值,再来比较值。
5. 错误抑制运算符
@
6. 执行运算符
``
7. 递增递减运算符
++ --
PHP支持C语言风格的,前置或后置递增、递减运算
前置和后置的区别:
++$a :前置。$a 的值先加1,然后返回加1后的结果。
$a++:后置。先返回
$a,然后将 $a 的值加1。
8. 逻辑运算符
and:逻辑与,$a and $b,只有当 $a 和 $b 都为true时,结果才为true。
or:逻辑或,$a or $b,当 $a 或 $b 中任一一个为true时,结果就为true。
xor:逻辑异或,$a xor $b,只有当 $a 和 $b 不同(一真一假)时,结果才为true。
!:逻辑非,! $a,取反,只有当 $a 为false时,结果才为true。
&&:逻辑与,功能同and,但优先级不同。
||:逻辑或,功能同or,但优先级不同。
注意:逻辑运算符中容易出现短路的问题,前一个表达式的结果明确后,通过它如果可以明确整个运算表达式的结果(true或false)时,后面的表达式将不会执行。
9. 字符串运算符
.:字符串连接运算符(.)。
也可以使用连接赋值运算符(.=),如:
$a = 'hello';
$a .= 'world'; // 相当于 $a = $a . 'world';
类似的,算术运算符(+
- * / %),也有这样的写法。
10.
数组运算符
假设
$a 和 $b 是两个数组
$a
+ $b:联合,$a 和 $b 的联合集合,把右边的数组元素附加到左边的数组后面,两个数组中相同的键名,则只用左边数组中的,右边的被忽略。这和array_merge()的作用不同。
$a == $b:相等,如果 $a 和 $b 具有相同的键值对,结果就为true。
$a === $b:全等,如果 $a 和 $b 具有相同的键值对,且顺序和类型都相同,结果才为true。
$a != $b:不等
$a <> $b:不等
$a !== $b:不全等
11.
类运算符
instanceof:用于确定一个变量是否属于某个类的实例。
<?php
class MyClass {
};
$a = new MyClass();
$b = new MyClass();
$c = 'MyClass';
var_dump($a instanceof MyClass);
var_dump($a instanceof $b);
var_dump($a instanceof $c);
?>
上面三种情况,都是true。
此外,如果 MyClass 继承了某个父类,或实现(implements)了某个接口(interface),instanceof 后面的参数改为父类名或接口名时,其结果也是true。
12. 三元运算符(? : )
$a = $b ? $b : 0;
三元运算符的优先级高于赋值运算符,上述三元运算的含义是:如果 $b 为真,右侧表达式的值就为 $b,否则,右侧表达式的值就为0,最后,将表达式的值赋给$a。