PHP帮助手册拾遗一:运算符
1、基本的赋值运算符是“=”。一开始可能会以为它是“等于”,其实不是的。
它实际上意味着把右边表达式的值赋给左边的运算数。
赋值运算表达式的值也就是所赋的值。也就是说,“$a = 3”的值是 3。这样就可以做一些小技巧:
1 2 3 4 5 | <?php $a = ($b = 4) + 5; // $a 现在成了 9,而 $b 成了 4。 ?> |
2、取模 $a % $b 在 $a 为负值时的结果也是负值。
3、 尽管 ! 比 = 的优先级高,PHP 仍旧允许类似如下的表达式:if (!$a = foo()),在此例中 foo() 的输出被赋给了 $a。
同样,如下代码:
1 2 3 4 5 | <?php if ($a = 100 && $b = 200) { var_dump($a, $b); } ?> |
先赋值,再进行与运算
此问题鸟哥有一篇文章有谈到过,猛击http://www.laruence.com/2010/07/26/1668.html
4、如果比较一个整数和字符串,则字符串会被转换为整数。
如果比较两个数字字符串,则作为整数比较。此规则也适用于 switch 语句。
5、执行运算符
PHP 支持一个执行运算符:反引号(“)。注意这不是单引号!PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回(例如,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同。
1 2 3 4 | <?php $output = `ls -al`; echo $output; ?> |
注: 反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。
6、递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是 1。
1 2 3 4 5 6 | $b = TRUE; echo --$b; echo ++$b; $c = NULL; echo --$c; echo ++$c; |
输出在个1和一个空值
7、+ 运算符把右边的数组附加到左边的数组后面,但是重复的键值不会被覆盖。
1 2 3 4 | $array1 = array(1, 'key' => 2); $array2 = array('key' => 3, 'key1' => 4); $array = $array1 + $array2; var_dump($array); |
输出array(3) { [0]=> int(1) ["key"]=> int(2) ["key1"]=> int(4) }
数组2中的3已经不存在了,数组1中的2没有被覆盖
8、使用括号可以增强代码的可读性。
9、除号(“/”)总是返回浮点数,除非这两个运算数是整数(或由字符串转换成的整数)
这里手册中有一点没有说明,返回的值必须是整数才行,否则如 6/4的结果就是float了
//此处在某个中文手册中有翻译错误,意思完全弄反了,纠结…
代码示例:
1 2 3 4 5 6 7 8 9 | $a = 8; $b = 4; $c = $a / $b; var_dump($c); $a = 6; $b = 4; $c = $a / $b; var_dump($c); |
10、空字符串,false,NULL等值在算术运算符中将会以0对待。
如下所示代码:
1 2 3 | echo 5 * "", '<br>'; echo 5 + false, '<br>'; echo 5 / NULL, '<br>'; |
11、 加号、减号、点号运行的优先级是一样一样滴
如下所示代码:
1 2 | $var = 3; echo "string " . $var + 3; |
输出3
12、instanceof后面不能接字符串,可以直接接类名或包含类名的变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Demo { } $demo = new Demo(); /* 以变量的形式存储类名字符串是正确的 */ $class = "Demo"; if ($demo instanceof $class) { echo 'yes'; } /* 不能直接接类名的字符串,即类名不能加双引号 */ $demo = new Demo(); if ($demo instanceof "Demo") { echo 'yes'; } /* 类名上无引号 */ $demo = new Demo(); if ($demo instanceof Demo) { echo 'yes'; } |