PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的。本篇经将为大家介绍PHP开发中10个最常见的问题,希望能够对朋友有所帮助。
错误1:foreach循环后留下悬挂指针在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法:
12345 | $arr = array (1, 2, 3, 4); foreach ( $arr as & $value ) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8) |
这里有个问题很多人会迷糊。循环结束后,$value并未销毁,$value其实是数组中最后一个元素的引用,这样在后续对$value的使用中,如果不知道这一点,会引发一些莫名奇妙的错误:)看看下面这段代码:
12345678 | $array = [1, 2, 3]; echo implode( ',' , $array ), "/n" ; foreach ( $array as & $value ) {} // by reference echo implode( ',' , $array ), "/n" ; foreach ( $array as $value ) {} // by value (i.e., copy) echo implode( ',' , $array ), "/n" ; |
上面代码的运行结果如下:
123 | 1,2,3 1,2,3 1,2,2 |
你猜对了吗?为什么是这个结果呢?
我们来分析下。第一个循环过后,$value是数组中最后一个元素的引用。第二个循环开始:
综上,最终结果就是1,2,2
避免这种错误最好的办法就是在循环后立即用unset函数销毁变量:
12345 | $arr = array (1, 2, 3, 4); foreach ( $arr as & $value ) { $value = $value * 2; } unset( $value ); // $value no longer references $arr[3] |
对于isset()函数,变量不存在时会返回false,变量值为null时也会返回false。这种行为很容易把人弄迷糊。。。看下面的代码:
1234 | $data = fetchRecordFromStorage( $storage , $identifier ); if (!isset( $data [ 'keyShouldBeSet' ]) { // do something here if 'keyShouldBeSet' is not set } |
写这段代码的人本意可能是如果$data['keyShouldBeSet']未设置,则执行对应逻辑。但问题在于即使$data['keyShouldBeSet']已设置,但设置的值为null,还是会执行对应的逻辑,这就不符合代码的本意了。
下面是另外一个例子:
123456789 | 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']是否为真,下面这样实现会更好:
123456789 | if ( $_POST [ 'active' ]) { $postData = extractSomething( $_POST ); } // ... if ( $_POST [ 'active' ]) { echo 'post not active' ; } |
判断一个变量是否真正被设置(区分未设置和设置值为null),array_key_exists()函数或许更好。重构上面的第一个例子,如下:
1234 | $data = fetchRecordFromStorage( $storage , $identifier ); if (!
|