总括

  运算符可按照其能接受几个值来分组。一元运算符只能接受一个值,例如 !(逻辑取反运算符)或 ++(递增运算符)。二元运算符可接受两个值,例如熟悉的算术运算符 +(加)和 -(减),大多数 PHP 运算符都是这种。最后是唯一的三元运算符 ? :,可接受三个值;通常就简单称之为“三元运算符”

  运算符优先级指定了两个表达式绑定得有多“紧密”。例如,表达式 1 + 5 * 3 的结果是 16 而不是 18 是因为乘号(“*”)的优先级比加号(“+”)高。必要时可以用括号来强制改变优先级。例如:(1 + 5) * 3 的值为 18

  如果运算符优先级相同,那运算符的结合方向决定了该如何运算。例如,"-"是左联的,那么 1 - 2 - 3 就等同于 (1 - 2) - 3 并且结果是 -4. 另外一方面,"="是右联的,所以a=a=b =c等同于c等同于a = (b=b=c)

  [注意]没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1 在PHP是不合法的。但另外一方面表达式 1 <= 1 == 1 是合法的, 因为 == 的优先级低于 <=

优先级

结合方向运算符附加信息无clonenewclone和new左[array()右++--~类型和递增/递减无instanceof类型右!逻辑运算符左*/%算术运算符左+-.算术运算符和字符串运算符左<<>>位运算符无<<=>>=比较运算符无==!====!==<><=>比较运算符左&位运算符和引用左^位运算符左|位运算符左&&逻辑运算符左||逻辑运算符左??比较运算符左?:ternary右=+=-=*=**=/=.=%=&=|=^=<<=>>=赋值运算符左and逻辑运算符左xor逻辑运算符左or逻辑运算符

算术运算符

-$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 的符号相同

<?phpecho(5%3)."\n";//prints2echo(5%-3)."\n";//prints2echo(-5%3)."\n";//prints-2echo(-5%-3)."\n";//prints-2?>

赋值运算符

  基本的赋值运算符是“=”,它实际上意味着把右边表达式的值赋给左边的运算数

  赋值运算表达式的值也就是所赋的值。也就是说,“$a = 3”的值是 3

<?php$a=($b=4)+5;//$a现在成了9,而$b成了4。?>

  在基本赋值运算符之外,还有适合于所有二元算术,数组集合和字符串运算符的“组合运算符”,这样可以在一个表达式中使用它的值并把表达式的结果赋给它

x=yx+=yx-=yx*=yx/=yx%=y

<?php$a=3;$a+=5;//$a=$a+5;$b="Hello";$b.="There!";//$b=$b."There!";?>

引用赋值

  PHP 支持引用赋值,引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西

<?php$a=3;$b=&$a;//$b是$a的引用print"$a\n";//输出3print"$b\n";//输出3$a=4;//修改$aprint"$a\n";//输出4print"$b\n";//也输出4,因为$b是$a的引用,因此也被改变?>

递增/递减

例子名称效果++$a前加$a的值加一,然后返回$a$a++后加返回$a,然后将$a的值加一--$a前减$a的值减一,然后返回$a$a--后减返回$a,然后将$a的值减一

<?php$x=10;echo++$x;//输出11$y=10;echo$y++;//输出10$z=5;echo--$z;//输出4$i=5;echo$i--;//输出5?>

位运算符

  位运算符允许对整型数中指定的位进行求值和操作

例子  名称结果$a&$bAnd(按位与)将把$a和$b中都为1的位设为1$a|$bOr(按位或)将把$a和$b中任何一个为1的位设为1$a^$bXor(按位异或)将把$a和$b中一个为1另一个为0的位设为1~$a  Not(按位取反)将$a中为0的位设为1,反之亦然$a<<$b  Shiftleft(左移)将$a中的位向左移动$b次(每一次移动都表示“乘以2”)$a>>$b  Shiftright(右移)将$a中的位向右移动$b次(每一次移动都表示“除以2”)

比较运算符

  比较运算符,如同它们名称所暗示的,允许对两个值进行比较

例子名称结果$a==$b等于TRUE,如果类型转换后$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,如果$a严格小于$b$a>$b大于TRUE,如果$a严格大于$b$a<=$b小于等于TRUE,如果$a小于或者等于$b$a>=$b大于等于TRUE,如果$a大于或者等于$b

  如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对

<?phpvar_dump(0=="a");//0==0->truevar_dump("1"=="01");//1==1->truevar_dump("10"=="1e1");//10==10->truevar_dump(100=="1e2");//100==100->trueswitch("a"){case0:echo"0";//输出0break;case"a":echo"a";break;}?>

比较多种类型

运算数1类型运算数2类型结果null或stringstring将NULL转换为"",进行数字或词汇比较bool或null任何其它类型转换为bool,FALSE<TRUEobjectobject内置类可以定义自己的比较,不同类不能比较string、resource、numberstring、resource、number将字符串和资源转换成数字,按普通数学比较arrayarray具有较少成员的数组较小,如果运算数1中的键不存在于运算数2中则数组无法比较,否则挨个值比较object任何其它类型object总是更大array任何其它类型array总是更大

三元运算符

  "?:"三元运算符是一个比较运算符,对于表达式(expr1)?(expr2):(expr3),如果expr1的值为true,则此表达式的值为expr2,否则为expr3

<?php$a=78;//成绩$b=$a>=60?"及格":"不及格";echo$b;//及格?>

错误控制运算符

  PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉

  [注意]错误控制前缀@运算符只对表达式有效,@不会屏蔽解析错误的信息,不能把它放在函数或类的定义之前,也不能用于条件结构如if和foreach等

<?php$a=1;echo@$a;//1$b;echo@$b;//不报错?>

逻辑运算符

例子名称结果$aand$bAnd(逻辑与)TRUE,如果$a和$b都为TRUE$aor$bOr(逻辑或)TRUE,如果$a或$b任一为TRUE$axor$bXor(逻辑异或)TRUE,如果$a或$b任一为TRUE,但不同时是!$aNot(逻辑非)TRUE,如果$a不为TRUE$a&&$bAnd(逻辑与)TRUE,如果$a和$b都为TRUE$a||$bOr(逻辑或)TRUE,如果$a或$b任一为TRUE

<?php//foo()根本没机会被调用,被运算符“短路”了$a=(false&&foo());$b=(true||foo());$c=(falseandfoo());$d=(trueorfoo());//--------------------//"||"比"or"的优先级高//表达式(false||true)的结果被赋给$e//等同于:($e=(false||true))$e=false||true;//常量false被赋给$f,true被忽略//等同于:(($f=false)ortrue)$f=falseortrue;var_dump($e,$f);//bool(true)bool(false)//--------------------//"&&"比"and"的优先级高//表达式(true&&false)的结果被赋给$g//等同于:($g=(true&&false))$g=true&&false;//常量true被赋给$h,false被忽略//等同于:(($h=true)andfalse)$h=trueandfalse;var_dump($g,$h);//bool(false)bool(true)?>

字符串运算符

  有两个字符串运算符。第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数之后

<?php$a="Hello";$b=$a."World!";//now$bcontains"HelloWorld!"$a="Hello";$a.="World!";//now$acontains"HelloWorld!"?>

数组运算符

例子名称结果$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

<?php$x=array("a"=>"red","b"=>"green");$y=array("c"=>"blue","d"=>"yellow");$z=$x+$y;var_dump($z);//array(4){["a"]=>string(3)"red"["b"]=>string(5)"green"["c"]=>string(4)"blue"["d"]=>string(6)"yellow"}echo"<br>";var_dump($x==$y);//bool(false)echo"<br>";var_dump($x===$y);//bool(false)echo"<br>";var_dump($x!=$y);//bool(true)echo"<br>";var_dump($x<>$y);//bool(true)echo"<br>";var_dump($x!==$y);//bool(true)?>