php语言 百分网手机站

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

时间:2020-08-13 19:28:27 php语言 我要投稿

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

  在生活中,好多人疑惑PHP语言难不难呢?那么,小编来解答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)这里有个问题很多人会迷糊。

  错误1:foreach循环后留下悬挂指针

  在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法:

A   $arr=array(1,2,3,4);

  foreach($arras&$value){

  $value=$value*2;

  }

  // $arr is now array(2, 4, 6, 8)

  这里有个问题很多人会迷糊。循环结束后,$value并未销毁,$value其实是数组中最后一个元素的引用,这样在后续对$value的使用中,如果不知道这一点,会引发一些莫名奇妙的错误:)看看下面这段代码:

  $array=[1,2,3];

  echoimplode(',',$array),"\n";

  foreach($arrayas&$value){}// by reference

  foreach($arrayas$value){}// by value (i.e., copy)

  上面代码的运行结果如下:

  1,2,3

  1,2,3

  1,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);

  $value=$value*2;

  }

  unset($value);// $value no longer references $arr[3]

  错误2:对isset函数行为的错误理解

  对于isset函数,变量不存在时会返回false,变量值为null时也会返回false。这种行为很容易把人弄迷糊。。。看下面的代码:

  $data=fetchRecordFromStorage($storage,$identifier);

  if(!isset($data['keyShouldBeSet']){

  // do something here if 'keyShouldBeSet' is not set

  }

  写这段代码的人本意可能是如果$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’]是否为真,下面这样实现会更好:

  }

  // ...

  }

  判断一个变量是否真正被设置(区分未设置和设置值为null),array_key_exists函数或许更好。重构上面的第一个例子,如下:

  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

  }

  错误3:混淆返回值和返回引用

  考虑下面的代码:

  classConfig

  {

  private$values=;

  publicfunction getValues{

  return$this->values;

  }

  }