PHP編程中10個最常見的錯誤
在生活中,好多人疑惑PHP語言難不難呢?那麼,小編來解答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;
}
}
-
php遞歸創建和刪除文件夾的代碼
php中遞歸創建和刪除文件夾的代碼,供大家學習參考。就跟隨本站小編一起去了解下吧,想了解更多相關信息請持續關注我們應屆畢業生考試網!方法一複製代碼代碼如下:<?php/***目錄生成類:UtilsMakeDir*@authoryepeng*@since2010.3.18*/classUtilsMakeDir{//基目錄建...
-
PHP的SPL標準庫的用法介紹
本文介紹下,php編程中SPL中的用法,SPL,PHP標準庫(StandardPHPLibrary),此從PHP5.0起內置的組件和接口,有需要的朋友參考下。PHPSPL的用法SPL,PHP標準庫(StandardPHPLibrary),此從PHP5.0起內置的組件和接口,並且從PHP5.3已逐漸的成熟。SPL其實在所有的PHP5開發環境中被內置,...
-
PHP中iconv函數知識
iconv函數庫能夠完成各種字符集間的轉換,是php編程中不可缺少的基礎函數庫。下面是小編為大家蒐集整理出來的有關於PHP中iconv函數知識,有需要的小夥伴可以參考下。今天在修改論文在線的時候,遇到了iconv這個函數。學習一下1234header('Content-Type:applicat...
-
PHP字符串函數大彙總
我們大家知道無論哪種編程語言,字符串操作都是一個重要的基礎,往往是簡單而重要。PHP給我們提供了大量的字符串操作函數,功能強大,使用也比較簡單,在這裏小編為大家總結九類字符串函數。1.查找字符位置函數strpos($str,search,[int]):查找search在$str中的第一次位...