表达式
一切皆是表达式expr。5也是表达式啊,啊?对呀。好吧,听说这是编程行话,那,就用着吧。
运算符
表达式;有返回值。
结合方向 | 运算符 | 附加信息 |
---|---|---|
非结合 | clone new | clone 和 new |
左 | [ | array() |
非结合 | ++ -- | 递增/递减运算符 |
非结合 | ~ - (int) (float) (string) (array) (object) (bool) @ | 类型 |
非结合 | instanceof | 类型 |
右结合 | ! | 逻辑操作符 |
左 | * / % | 算术运算符 |
左 | + - . | 算术运算符 和 字符串运算符 |
左 | << >> | 位运算符 |
非结合 | < <= > >= <> | 比较运算符 |
非结合 | == != === !== | 比较运算符 |
左 | & | 位运算符 和 引用 |
左 | ^ | 位运算符 |
左 | | | 位运算符 |
左 | && | 逻辑运算符 |
左 | || | 逻辑运算符 |
左 | ? : | 三元运算符 |
右 | = += -= *= /= .= %= &= |= ^= <<= >>= | 赋值运算符 |
左 | and | 逻辑运算符 |
左 | xor | 逻辑运算符 |
左 | or | 逻辑运算符 |
左 | , | 多处用到 |
根据讨论区的贡献,说-> ,::是对象属性操作符,有人说应该归类进入运算符,不理解。
为了增强阅读性,我都是使用括号的。
算术运算符
莫非就是+-*/%和取反- 。有两点:
-除法运算符总是返回浮点数。只有在下列情况例外:两个操作数都是整数(或字符串转换成的整数)并且正好能整除,这时它返回一个整数。
-取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。
赋值运算符
=,就是这个等于符号了。记得第二门语言的老师才告诉我(高中学那什么玩意儿时候说是等于)这是“赋值”。那些组合运算符,也勉强叫做赋值运算符吧。
位运算符
例子 | 名称 | 结果 |
---|---|---|
$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”)。 |
这个表表非常好啊。我没其他感想了。嘿嘿。
比较运算符
例子 | 名称 | 结果 |
---|---|---|
$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 语句。
这个更有意思:
运算数 1 类型 | 运算数 1 类型 | 结果 |
---|---|---|
null 或 string | string | 将 NULL 转换为 "",进行数字或词汇比较 |
bool 或 null | 任何其它类型 | 转换为 bool,FALSE < TRUE |
object | object | 内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的说明 |
string,resource 或 number | string,resource 或 number | 将字符串和资源转换成数字,按普通数学比较 |
array | array | 具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,否则挨个值比较(见下例) |
array | 任何其它类型 | array 总是更大 |
object | 任何其它类型 | object 总是更大 |
错误控制运算符
@,讨厌它。我有洁癖的。
执行运算符
``,就是它们。一般在生产环境都是关闭掉这个玩意儿的,安全啊。和shell_exec()等同。
递增/递减运算符
--++。没了。大学时候的谭浩强C,为这个讲了好几页,神奇。
逻辑运算符
例子 | 名称 | 结果 |
---|---|---|
$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;
-||高于or。
字符串运算符
. , .=没了。但是在使用 , 时要注意不能在函数调用参数中使用,因为作为分隔参数在用呢。
数组运算符
例子 | 名称 | 结果 |
---|---|---|
$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 。 |
其中,联合操作时,由于时左联,所以,左边数组和右边数组有有相同的键名时候,该元素不会被覆盖。做的是向后push的操作。
各种等等操作,是kv的比较。
类型运算符
instanceof 用于确定一个 PHP 变量是否属于某一类 class 、父类的子类(extends)、接口(inferface)的实例。