Table of Contents
1 主题
本文主要是记录一些php编码的注意事项, 以免踩坑
2 类型自动转换
2.1 字符串比较大小
两个字符串大小关系的比较, 用strcmp, 不要用==, < or >
2.1.1 例子
code:
<?php //such as $a = md5('xxxxx'); $a = "0e123456789012345678901234567890"; $b = "0e223456789012345678901234567890"; var_dump($a < $b); var_dump(strcmp($a, $b) < 0);
输出为:
bool(false) bool(true)
原因:
用<进行比较的时候,把$a和$b转成整数了,值都为0(科学计算法),而用strcmp进行比较是很安全的,不会做神马转换
2.2 in_array的用法
注意in_array函数第三个参数的意义,严格检查类型:
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
2.2.1 例子
code:
<?php $arr = array(0); if(in_array('xxxx', $arr)) { echo "yes\n"; } else { echo "no\n"; }
输出为:
yes
原因:
和上面那个case一样的,进行比较的时候,也自动做了类型的转换,'xxxx'转换为整数为0,于是就在数组中了
3 现有php的bug
3.1 CURLOPT_POSTFIELDS参数的改变
注意传入CURLOPT_POSTFIELDS的参数的变化
3.1.1 例子
code:
<?php $ch = curl_init(); $post_data = array('a' => 1, 'b' => '2'); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); if($post_data['a'] === 1) { echo "yes\n"; } else { echo "no\n"; }
输出为:
no
原因:
现有php代码的bug,没有对参数做变量分离,已经向官方提bug了(https://bugs.php.net/bug.php?id=67704),并在github上提了PR(https://github.com/php/php-src/pull/927)
4 其它
4.1 尽量不要写php的右关闭符号
如果写了php的右关闭符号(?>),则在这个符号后面一定不能有任何额外的字符,包括空格或者回车, 这些额外字符会被一起输出给client
4.2 foreach与引用
这是一个老问题了,网上有很多case 在foreach里使用引用完毕的时候, 需要把引用的变量unset ,否则坑太多了
4.2.1 例子
code:
<?php $arr = array('a', 'b'); foreach($arr as &$item); print_r($arr); //unset($item);//if unset $item, it will ok foreach($arr as $item); print_r($arr);
输出为:
Array ( [0] => a [1] => b ) Array ( [0] => a [1] => a )
原因:
在第一个foreach后,item还是指向$arr[1],在后续的foreach里,$arr[1]被$arr[0]以及$arr[1]赋值,所以$arr[1]的值就是和$arr[count($arr) - 2]的值一样的了 可以再看看这个:http://stackoverflow.com/questions/8220399/php-foreach-pass-by-reference-last-element-duplicating-bug