简介:运算符是能够经过给出的一或多个值(用编程行话来讲,表达式)来产生另外一个值的东西。因此能够认为函数或任何会返回一个值(例如 print)的结构是运算符,而那些没有返回值的(例如 echo)是别的东西。 有三种类型的运算符。第一种是一元运算符,只运算一个值,例如 !(取反运算符)或 ++(加一运算符)。第二种是有限二元运算符,PHP 支持的大多数运算符都是这种。 第三种是三元运算符:?:。它应该被用来根据一个表达式在另两个表达式中选择一个,而不是用来在两个语句或者程序路线中选择。把整个三元表达式放在扩号里是个很好的主意。 php
1、运算符优先级
php运算符优先级和咱们学的数学大体相同,例如,表达式 1 + 5 * 3 的结果是 16 而不是 18 是由于乘号(“*”)的优先级比加号(“+”)高。必要时能够用括号来强制改变优先级。例如:(1 + 5) * 3 的值为18。若是运算符优先级相同,则使用从左到右的左联顺序。 下表从高到低列出了运算符的优先级。同一行中的运算符具备相同优先级,此时它们的结合方向决定求值顺序。 左联表示表达式从左向右求值,右联相反。 linux
结合方向 |
运算符 |
附加信息 |
非结合 |
clone new |
clone 和 new |
左 |
[ |
array() |
非结合 |
++ – |
递增/递减运算符 |
非结合 |
~ – (int) (float) (string) (array) (object) (bool) @ |
类型 |
非结合 |
instanceof |
类型 |
右结合 |
! |
逻辑操做符 |
左 |
* / % |
算术运算符 |
左 |
+ – . |
算术运算符和字符串运算符 |
左 |
<< >> |
位运算符 |
非结合 |
< <= > >= <> |
比较运算符 |
非结合 |
== != === !== |
比较运算符 |
左 |
& |
位运算符和引用 |
左 |
^ |
位运算符 |
左 |
| |
位运算符 |
左 |
&& |
逻辑运算符 |
左 |
|| |
逻辑运算符 |
左 |
? : |
三元运算符 |
右 |
= += -= *= /= .= %= &= |= ^= <<= >>= |
赋值运算符 |
左 |
and |
逻辑运算符 |
左 |
xor |
逻辑运算符 |
左 |
or |
逻辑运算符 |
左 |
, |
多处用到 |
2、算数运算符
算数运算符和数学彻底同样,看下表便可。 shell
例子 |
名称 |
结果 |
-$a |
取反 |
$a 的负值。 |
$a + $b |
加法 |
$a 和 $b 的和。 |
$a – $b |
减法 |
$a 和 $b 的差。 |
$a * $b |
乘法 |
$a 和 $b 的积。 |
$a / $b |
除法 |
$a 除以 $b 的商。 |
$a % $b |
取模 |
$a 除以 $b 的余数 |
注意:除法运算符老是返回浮点数。只有在下列状况例外:两个操做数都是整数而且正好能整除,这时它返回一个整数。取模运算符的操做数在运算以前都会转换成整数(除去小数部分)。 取模 $a % $b 在 $a为负值时的结果也是负值。 要注意变量的大小,好比3333333333 % 3值不是0; 编程
3、赋值运算符
=应该都熟悉吧,咱们一开始就开始用了,这个就是赋值运算符了。它意味着把右边表达式的值赋给左边的运算数。赋值运算表达式的值也就是所赋的值。也就是说,“$a = 3”的值是 3。 赋值运算符能够和不少其余运算符结合生成组合运算符好比+=,-=,*=,.=等等,他表示的是左边的变量和右边的变量运算事后赋值给左边的变量。好比$a+=$b 等同于$a = $a+$b; 为了运算过程清晰,我我的认为尽可能不要使用$a .=$b .=$c这种结构。你们能够试试下面的代码,看看是否是和你们想的结果同样。若是不同对比下运算符优先级表,再思考一下。 数组
4、位运算符
我以为在个人工做中位运算符用的很少,因此大体介绍下吧,遇到了再仔细研究研究。 安全
例子 |
名称 |
结果 |
$a & $b |
And(按位与) |
将把 $a 和 $b 中都为 1 的位设为 1。 |
$a | $b |
Or(按位或) |
将把 $a 或者 $b 中为 1 的位设为 1。 |
$a ^ $b |
Xor(按位异或) |
将把 $a 和 $b 中不一样的位设为 1。 |
~ $a |
Not(按位非) |
将 $a 中为 0 的位设为 1,反之亦然。 |
$a << $b |
Shift left(左移) |
将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
$a >> $b |
Shift right(右移) |
将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
5、比较运算符
这个比较好理解,就是比大小了。 函数
例子 |
名称 |
结果 |
$a == $b |
等于 |
TRUE,若是 $a 等于 $b。 |
$a === $b |
全等 |
TRUE,若是 $a 等于 $b,而且它们的类型也相同。(PHP 4 引进) |
$a != $b |
不等 |
TRUE,若是 $a 不等于 $b。 |
$a <> $b |
不等 |
TRUE,若是 $a 不等于 $b。 |
$a !== $b |
非全等 |
TRUE,若是 $a 不等于 $b,或者它们的类型不一样。(PHP 4 引进) |
$a < $b |
小与 |
TRUE,若是 $a 严格小于 $b。 |
$a > $b |
大于 |
TRUE,若是 $a 严格 $b。 |
$a <= $b |
小于等于 |
TRUE,若是 $a 小于或者等于 $b。 |
$a >= $b |
大于等于 |
TRUE,若是 $a 大于或者等于 $b。 |
注意:若是比较一个整数和字符串,则字符串会被转换为整数。若是比较两个数字字符串,则做为整数比较。此规则也适用于
switch 语句。
对于多种类型,比较运算符根据下表比较(按顺序)。 spa
6、三元运算符
$a?$b:$c;好像是惟一的三元运算符,其实等同于 .net
他表示的是表达式 ($a) ? ($b) : ($c) 在 $a 求值为 TRUE 时的值为 $b,在 $a 求值为 FALSE时的值为 $c。 和组合运算符同样,我也不建议你们把三元运算符堆积在一块儿使用,这样会形成运算结果不清晰。 code
7、错误控制运算符
错误控制是指抑制错误输出,即当在某条语句前放置@之后若是该语句出错将被忽略。 注意:目前的“@”错误控制运算符前缀甚至使致使脚本终止的严重错误的错误报告也失效。这意味着若是在某个不存在或类型错误的函数调用前用了“@”来抑制错误信息,那脚本会没有任何迹象显示缘由而死在那里。 注意:@ 运算符只对表达式有效。对新手来讲一个简单的规则就是:若是能从某处获得值,就能在它前面加上 @ 运算符。例如,能够把它放在变量,函数和 include() 调用,常量,等等以前。不能把它放在函数或类的定义以前,也不能用于条件结构例如 if 和 foreach等。
8、执行运算符
该运算符是“即1左边的那个按键。能够实现相同功能的函数是 shell_exec()。看例子
1 |
$output = `ls -al`;//linux使用 |
2 |
$output2 = `dir`;//win使用 |
注意:反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。
9、递增/递减运算符
递增即加1,递减即减1 注意:递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,可是递增 NULL的结果是 1。
例子 |
名称 |
效果 |
++$a |
前加 |
$a 的值加一,而后返回 $a。 |
$a++ |
后加 |
返回 $a,而后将 $a 的值加一。 |
–$a |
前减 |
$a 的值减一, 而后返回 $a。 |
$a– |
后减 |
返回 $a,而后将 $a 的值减一。 |
试试下面的代码看看是否是和本身想的同样,若是不同再回去对照下上表,仔细思考下
其实只要抓住一个规律,–$a 这种符号在前的等同于$a = $a-1;先算掉,而后在把$a代入到表达式中。另外字母其实也是能够++ –的,这个你们本身去试试吧。
10、逻辑运算符
例子 |
名称 |
结果 |
$a and $b |
And(逻辑与) |
TRUE,若是 $a 与 $b 都为 TRUE。 |
$a or $b |
Or(逻辑或) |
TRUE,若是 $a 或 $b 任一为 TRUE。 |
$a xor $b |
Xor(逻辑异或) |
TRUE,若是 $a 或 $b 任一为 TRUE,但不一样时是。 |
! $a |
Not(逻辑非) |
TRUE,若是 $a 不为 TRUE。 |
$a && $b |
And(逻辑与) |
TRUE,若是 $a 与 $b 都为 TRUE。 |
$a || $b |
Or(逻辑或) |
TRUE,若是 $a 或 $b 任一为 TRUE。 |
注意:and和&&以及或和||虽然意义是同样的,可是他们的运算优先级是不同的。
还有要注意的一点是短路现象,当&&的左边已经为false的时候,and的右边不在去计算,当||的左边已是true的时候||的右边再也不去计算。看下面的例子
是否是i’m here 不必定出现?这就表明了,test不必定运行。另外注意下下面的这段代码,想一下为何
1 |
$test = true and false; // $test === true |
2 |
$test = (true and false); // $test === false |
3 |
$test = true && false; // $test === false |
11、字符串运算符
这个咱们在前面几篇文章的时候就用过了,就是那个“.”了,下面的例子用了他的两种形式,注意观察,前面也讲过了,这里不在赘述
12、数组运算符
例子 |
名称 |
结果 |
$a + $b |
联合 |
$a 和 $b 的联合。 |
$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。 |
注意:+ 运算符把右边的数组元素(除去键值与左边的数组元素相同的那些元素)附加到左边的数组后面,可是重复的键值不会被覆盖。
数组中的单元若是具备相同的键名和值则比较时相等。看下面的例子(不少例子我不会直接给出答案,因此请你们本身运行下)
1 |
$a = array("趴树上的猪","qaforcode.net"); |
2 |
$b = array(1=>"qaforcode.net",0=>"趴树上的猪"); |
数组运算符还有不少博大精深的函数,之后再介绍。
十3、类型运算符
instanceof 用于肯定一个 PHP 变量是否属于某一类 (class,包括父类) 的实例:
注意:instanceof 运算符是 PHP 5 引进的。在此以前用 is_a(),可是 is_a() 已通过时了,最好用instanceof。另外不能使用!instanceof,可是能够用!($a instanceof $b)效果是同样的,这里为了运算前后清晰加上小括号,其实是不用的。
试试下面的例子吧
05 |
class MyClass extends ParentClass |
11 |
var_dump($a instanceof MyClass); |
12 |
var_dump( !($a instanceof ParentClass)); |
18 |
class ZhugeClass implements MyInterface |
25 |
var_dump($a instanceof $b); |
本文固定连接: http://www.qaforcode.net/archives/233 | 猪哥每日一贴