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.1.1   例子

code:

<?php
    echo "hi\n";
?>xxxxxxx

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