简介:PHP运算符学习笔记
1.基本规则
如果运算符优先级相同,则由运算符的结合方向决定如何运算。没有结合方向的同优先级运算符不能连在一起使用。即使在没有必要的情况下,最好也使用括号明确运算的顺序。
具体运算符的优先级参照http://php.net/manual/zh/language.operators.precedence.php
2.结合方向的理解
“左结合性”意味表达式的运算方向为从左向右,“右结合性”则相反。例如:已知“=”是右结合性的,那么表达式“$x = $y = $z;”的运算顺序是先执行“$y = $z;”,由上一篇笔记可知,这个赋值语句的值是$z;此后执行“$x = ($y = $z);”,即“$x = $z;”,完成整个赋值语句,最终结果为“$x = $z;$y = $z”。虽然结果很好理解,但过程并不直接。
3.取模(%)运算中的注意点
在进行取模运算前,运算的数都会被去除小数点后的数值,变为整数。
取模运算结果的正负号与被除数的正负号相同。
4.类似“$a += 3;”这样的加法运算表达式,字符串也有这样的表达式“.=”
$b = "Hello ";
$b .="world"; //输出结果为"Hello world",其等效为 $b = $b . "world";
5.位移操作在PHP中是数学操作,任何被移出的位都将被丢弃。左移时右侧将用0填充,意味着符号位不被保留;右移时左侧用符号位填充,意味着符号位可以得到保留。
6.没见过的几个比较运算符
太空船运算符(组合比较符):“<=>”,例如“$a <=> $b;”,当$a小于\等于\大于$b时返回一个小于\等于\大于0的整型数。
NULL合并操作符:“??”,例如“$a ?? $b ?? $c;”,返回从左到右的第一个不为NULL的操作数;若所有操作数为NULL,则返回NULL。
7.三元运算符的一个使用例(来自http://php.net/manual/zh/language.operators.comparison.php)
三元运算符还可以进一步简化:代码“exp1 ?: exp2;”将在exp1为TRUE时返回exp1,否则返回exp2。此外,三元运算符是一个语句而不是变量,不可以对其进行引用操作。
不要将三元运算符堆积在一起使用。
8.仅对表达式有效的运算符“@”可以忽略掉此表达式出现的所有错误信息。(“如果能从某处得到值,就能在它前面加上@运算符。”)
9.关于递增\递减运算符
该运算符并不会影响布尔值。对NULL的递减操作没有效果,对NULL的递增的结果是整型数1.
php
@a = TRUE; //结果应为TRUE
var_dump(++@a);
var_dump(@a++);
var_dump(--@a);
var_dump(@a--);
@b = FALSE; //结果应为FALSE
var_dump(++@b);
var_dump(@b++);
var_dump(--@b);
var_dump(@b--);
@c = NULL;
var_dump(++@c);//结果应为整型数1
var_dump(@c++);//结果应为NULL(存疑)
var_dump(--@c);//这里的两个结果都将为NULL
var_dump(@c--);
@d = 'A'
@d++; //结果为'AA',这是与C语言不同的地方
?>
一篇很有用的大神的文章:http://www.php.cn/php-weizijiaocheng-369859.html
10.逻辑运算符
与运算比或运算有更高的优先级,符号与(“&”)、符号或(“||”)比“and”、“or”有更高的优先级。“and”、“or”的优先级甚至比赋值用的“=”更低。因此有下面这个例子
php
$a = FALSE || TRUE;
//这个的结果是$a=TRUE
$b = FALSE and TRUE;
//这个的结果是$b=FALSE,因为“=”优先级更高,$b被先行赋值FALSE
?>
11.数组运算符中要注意的点
“$arr1 + $arr2;”中仅会用$arr2在$arr1中没有的键值对补充进$arr1中,键名相同的部分将保留$arr1中的值。
“!=”在两数组不等时为TRUE,“!==”则在不全等时为TRUE(这俩....似乎没区别?)
不等“!=”还可以写成“<>”
数组中“===”为TRUE的条件是键值对相等且类型相同。
12.类型运算符
instanceof用于检测一个变量是否属于某一个类\是否属于继承自某一个父类的某一个子类\是否实现了某一个接口的对象的实例;还可判断2个变量是否属于同一类。
注意别把它当成函数了...
如果被检测的变量不是对象,该运算不会提醒你而是仅仅返回FALSE。
疑问:
1.对new运算符的引用为什么会产生警告?
2.http://php.net/manual/zh/language.operators.comparison.php中涉及的字符串的比较似乎不完全符合字符串转数值的规则?