1.运算符的优先级
请参照这个表
http://www.php.net/manual/zh/language.operators.precedence.php
例1:
$a = $b+=3; 事实发生的顺序为
$a = ($b+=3);
++$a + $a++; 事实发生的顺序为
(++$a) + ($a++); 前一个++$a将会影响到后面的$a++中的$a的值。
最好使用括号,让人易懂。
例2. !$a = foo()
!的优先级比=高 ,但两者结合的顺序都是从右往左 所以这个表达式的执行顺序为!($a=foo())
谁会扯蛋这么写? 除了让人看着头晕以外,没有其他任何作用了。
2.算术运算符
注意:除法几乎总是返回浮点数(除非两个数都为整数且能整除才返回INT)
注意:取模(或称取余)时,浮点数会被忽略小数,转为整数计算。 如:5.5%3=2
注意:取模(或称取余)时,余数的符号与前者相同
-5%3 = �C2,5%-3=2
3.赋值运算符
基本的赋值运算符就是=
注意:PHP5中$x = object 默认是引用object,修改$x 会同时修改object里的内容,所以如果需要完全COPY的话 用clone
直接引用赋值 $a = &$b;
注意:new返回的是一个引用 所以$a = &new x;会报错。
但 new 引用赋值给$a后 $b = &$a;是不会报错的,因为这时$a是new x引用表示的字符串,而非new x。
4.位运算符
& 与 00得0,10得0,11得1。(同时为1才为1,否则都为0)
| 或 00得0,10得1,11得1。(同时为0才为0,否则都为1)
^ 异或 00得0,10得1,11得0。(两边相等则为0,否则都为1)
~ 取反 (就是转换为二进制后,全部反转,0变1,1变0)
<< 左移 将对象二进制后左移X位,左边丢,右边补0
>> 右移 将对象二进制后右移X位,左边补(正数补0,负数补1),右边丢
(C++里还有>>>叫无符号右移,即左边无论正负都补0,右边丢)
注意:由于==的优先级比&高,所以$a&$b==true 的事实发生顺序为$a&($b==true),所以如果要让前面先运算则需加上括号($a&$b) == true;
注意:不要在32位系统下右移超过32位,也不要在结果可能超过32位的情况下左移,可用GMP移动。
例:一个蛋疼的判断奇偶的办法
<?php
/**
* 判断一个数是奇数还是偶数
* 思路为:
* 奇数的话,他右移一位得到的结果永远是1
* 而偶数右移一位得到的结果永远是0
* */
$a = 7; //101
$b = $a>>1; //10
$c = $b<<1; //100
echo $c^$a; //100 ^ 101 得到001 判断出来了 ^ 相同的为0,不同才为1
?>
如何将位移出来的位保存下来,可以用&上移出来的位,需要用到的函数为base_convert
5.比较运算符
注意:switch是==比较
注意:浮点由于实际值的不准确,所以不应相比较。(可是没办法啊)
三元运算在5.3后可以这么写 expr1?:expr3; expr1为真返回expr1否则返回expr3
6.错误运算符
符号为@,最好和 or die结合使用。
如果激活了ini的track_errors 则错误会被存放在$php_errormsg中。
set_error_handler可以自定义错误处理函数(不深究了)
7.执行运算符
符号为反引号``,功能与shell_exec相同
这个挺好的,比如linux的ls win的dir 直接显示目录里的文件
8.递增递减运算符
这个没啥说的 注意符号在变量前后的区别
9.逻辑运算符
and 和&&差不多 但注意优先级
or 和||差不多
xor a和b任何一个为真就为真,但两者同时为真或假都为假
! 反着来
&& 并且
|| 或者
10.字符串运算符
. 连接符 .= 合并
11.数组运算
+ 合并两个数组(如果有相同的键名,左边覆盖右边)
== 判断两个数组键和值是否相等,顺序可以不一样
=== 全等就不说了
!= 和==相反
<> 和!=差不多
!== 不全等(和===相反)
12.类型运算符
instanceof 判断变量是否是一个对象的实例(引不引用都一样)
$a=new myclass;
echo $a instanceof myclass;(也支持字符串判断 $a instanceof “myclass”)
还可以判断是否是接口的实例
instanceof和 is_a功能一模一样。
扩展:is_subclass_of(obj,classname) 判断对象是否是该类的子类
注意:仅能判断是否属于对象的一个实例,而不能判断两个对象是否相同。(相同的实例判断应用==或=== 或者转换成array再==)