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