如果运算符优先级相同,其结合方向决定着应该从右向左求值,还是从左向右求值。
下表按照优先级从高到低列出了运算符。
结合方向 | 运算符 | 附加信息 |
---|---|---|
无 | clone new | clone 和 new |
左 | [ | array() |
右 | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | 类型和递增/递减 |
无 | instanceof | 类型 |
右 | ! | 逻辑运算符 |
左 | * / % | 算术运算符 |
左 | + - . | 算术运算符和字符串运算符 |
左 | << >> | 位运算符 |
无 | == != === !== <> | 比较运算符 |
左 | & | 位运算符和引用 |
左 | ^ | 位运算符 |
左 | | | 位运算符 |
左 | && | 逻辑运算符 |
左 | || | 逻辑运算符 |
左 | ? : | 三元运算符 |
右 | = += -= *= /= .= %= &= |= ^= <<= >>= => | 赋值运算符 |
左 | and | 逻辑运算符 |
左 | xor | 逻辑运算符 |
左 | or | 逻辑运算符 |
左 | , | 多处用到 |
对具有相同优先级的运算符,左结合方向意味着将从左向右求值,右结合方向则反之。对于无结合方向具有相同优先级的运算符,该运算符有可能无法与其自身结合。举例说,在 PHP 中 1 < 2 > 1 是一个非法语句,而 1 <= 1 == 1则不是,因为‘==’的优先级小于‘《=’。
注意:虽然PHP明确指出有运算符的优先级,但是我个人觉得只要了解,知道有这个东西就行了,费时间去把各种运算符之间的优先级记下来是没有必要的,因为当我们不确定运算符优先级的时候可以通过()来改变该表达式的优先级。
这些运算符中值得一提的是位运算符:
位运算符允许对整型数中指定的位进行求值和操作。
例子 | 名称 | 结果 |
---|---|---|
$a & $b |
And(按位与) | 将把 $a 和 $b 中都为 1 的位设为 1。 |
$a | $b |
Or(按位或) | 将把 $a 和 $b 中任何一个为 1 的位设为 1。 |
$a ^ $b |
Xor(按位异或) | 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 |
~ $a |
Not(按位取反) | 将 $a 中为 0 的位设为 1,反之亦然。 |
$a << $b |
Shift left(左移) | 将 $a 中的位向左移动 $b 次(每一次移动都表示"乘以 2")。 |
$a >> $b |
Shift right(右移) | 将 $a 中的位向右移动 $b 次(每一次移动都表示"除以 2")。 |
在PHP中向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。
注意 : 要注意数据类型的转换。如果左右参数都是字符串,则位运算符将对字符的 ASCII 值进行操作。
用八位制来举例:
1111 1111 代表255 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 (分别对应每一位1)
即:
2^0=1,相应2进数为”0001″(^表示成幂指数,即:2的0次方)
2^1=2,相应2进数为”0010″
2^2=4,相应2进数为”0100″
2^3=8,相应2进数为”1000″
注意: 计算的时候记着8421原则(即上面的运算简化)就能很快的进行转换 。
还有就是数组运算符:
例子 | 名称 | 结果 |
---|---|---|
$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 。 |
以及instanceof运算符:
instanceof用于确定一个PHP变量是否属于某一类的实例,instanceof也可用来确定一个变量是不是继承自某一父类的子类的实例,instanceof也可用于确定一个变量是不是实现了某个接口的对象的实例。