中国程序员网吧 关注:1贴子:12
  • 1回复贴,共1

PHP编程中10个最常见的错误

只看楼主收藏回复

本篇文章列举了我们在php编程中比较常见的一些错误,此文列举10个。
错误1:foreach循环后留下悬挂指针
在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法:
$arr = array(1, 2, 3, 4);foreach ($arr as &$value) { $value = $value * 2;}// $arr is now array(2, 4, 6, 8)
这里有个问题很多人会迷糊。循环结束后,$value并未销毁,$value其实是数组中最后一个元素的引用,这样在后续对$value的使用中,如果不知道这一点,会引发一些莫名奇妙的错误:)看看下面这段代码:
$array = [1, 2, 3];echo implode(',', $array), "\n";foreach ($array as &$value) {} // by referenceecho implode(',', $array), "\n";foreach ($array as $value) {} // by value (i.e., copy)echo implode(',', $array), "\n";
上面代码的运行结果如下:
1,2,31,2,31,2,2
你猜对了吗?为什么是这个结果呢?
我们来分析下。第一个循环过后,$value是数组中最后一个元素的引用。第二个循环开始:
第一步:复制$arr[0]到$value(注意此时$value是$arr[2]的引用),这时数组变成[1,2,1]
第二步:复制$arr[1]到$value,这时数组变成[1,2,2]
第三步:复制$arr[2]到$value,这时数组变成[1,2,2]
综上,最终结果就是1,2,2
避免这种错误最好的办法就是在循环后立即用unset函数销毁变量:
$arr = array(1, 2, 3, 4);foreach ($arr as &$value) { $value = $value * 2;}unset($value); // $value no longer references $arr[3]


IP属地:浙江1楼2016-08-24 15:20回复
    #本文更多内容请点击地址:http://u.cxyblog.com/22/article-aid-541.html #
    错误2:对 isset() 函数行为的错误理解
    对于 isset() 函数,变量不存在时会返回false,变量值为null时也会返回false。这种行为很容易把人弄迷糊。。。看下面的代码:
    $data = fetchRecordFromStorage($storage, $identifier);if (!isset($data['keyShouldBeSet']) { // do something here if 'keyShouldBeSet' is not set // from : http://www.phper note.com}
    写这段代码的人本意可能是如果$data['keyShouldBeSet']未设置,则执行对应逻辑。但问题在于即使$data['keyShouldBeSet']已设置,但设置的值为null,还是会执行对应的逻辑,这就不符合代码的本意了。
    下面是另外一个例子:
    if ($_POST['active']) { $postData = extractSomething($_POST);}// ...if (!isset($postData)) { echo 'post not active';}
    上面的代码假设$_POST['active']为真,那么$postData应该被设置,因此isset($postData)会返回true。反之,上面代码假设isset($postData)返回false的唯一途径就是$_POST['active']也返回false。
    真是这样吗?当然不是!
    即使$_POST['active']返回true,$postData也有可能被设置为null,这时isset($postData)就会返回false。这就不符合代码的本意了。
    如果上面代码的本意仅是检测$_POST['active']是否为真,下面这样实现会更好:
    if ($_POST['active']) { $postData = extractSomething($_POST);}// ...if ($_POST['active']) { echo 'post not active';}
    判断一个变量是否真正被设置(区分未设置和设置值为null),array_key_exists()函数或许更好。重构上面的第一个例子,如下:
    $data = fetchRecordFromStorage($storage, $identifier);if (! array_key_exists('keyShouldBeSet', $data)) { // do this if 'keyShouldBeSet' isn't set}
    另外,结合get_defined_vars()函数,我们可以更加可靠的检测变量在当前作用域内是否被设置:
    if (array_key_exists('varShouldBeSet', get_defined_vars())) { // variable $varShouldBeSet exists in current scope}


    IP属地:浙江2楼2016-08-24 15:22
    回复