![](/img/trans.png)
[英]php array_key_exists, !empty and isset fails for no reason?
[英]Replacing array_key_exists() with isset() in PHP
了解PHP中array_key_exists()
和isset()
的區別,我在網絡上看到很多擁護者建議用isset()
替換array_key_exists()
isset()
,但是我認為這樣做安全嗎?
在一個項目中,我具有用戶提交的$ var值。 該值可以是任何值,甚至可以為NULL或完全不設置。 我想使用!empty($var)
來檢查$var
持有非空值,但我知道單獨使用!empty($var)
是危險的,因為如果未預先定義$var
,PHP將拋出一個錯誤。
所以我有isset($var) && !empty($var)
來檢查$var
是否持有非空值。
但是,當我將一個值存儲在assoc數組中時,事情就變得復雜了。 比較以下內容,假設數組$arr
始終存在,但鍵foo
可能存在或可能不存在於$arr
。
// code snipplet 1
$arr = array();
echo isset($arr['foo']);
// code snipplet 2
$arr = array();
echo array_key_exists('foo', $arr) && !is_null($arr['foo']);
代碼片段2始終可以使用,但看起來笨拙且難以閱讀。 至於代碼片段1 ,我的經歷很糟糕……我以前在開發機器上寫過類似的東西。 它運行得很好,但是當我將代碼部署到生產機器上時,它僅僅因為數組中不存在鍵而引發了錯誤。 經過一些調試后,我發現開發機器和生產機器之間的PHP配置不同,它們的PHP版本也略有不同。
所以,我在想用isset()
替換array_key_exists()
真的安全嗎? 如果不是,那么代碼片段2的更好替代方案是什么?
在一個項目中,我具有用戶提交的$ var值。
這是如何運作的? 用戶不應設置變量 。 他們應該能夠例如提交以$_POST
結尾的表單值。 我再說一遍,它們應該不能直接在您的范圍內創建變量 。
如果“用戶”是指人們在其中編寫並include
PHP代碼的某種插件系統,那么您可能需要考慮定義一個比設置變量更穩定的接口。
該值可以是任何值,甚至可以為NULL…
如果這是通過HTTP提交的值,則不會。 HTTP沒有null
概念。 它要么是一個空字符串,要么根本不存在。
單獨使用
!empty($var)
是危險的,因為如果未預先定義$var
,PHP將拋出錯誤
那是錯的。 專門存在empty
來測試變量是否為假,而不拋出錯誤。 empty($var)
與!$var
相同,但是如果變量不存在則不會觸發錯誤。
所以我有
isset($var) && !empty($var)
來檢查$var
是否持有非空值。
請參閱為什么同時檢查isset()和!empty() 。 (劇透:這是多余的。)
echo isset($arr['foo']); echo array_key_exists('foo', $arr) && !is_null($arr['foo']);
這些都做完全相同的事情。 如果值存在並且其值不為null
則isset
返回true
。 如果數組鍵存在並且其值不為null
則第二行返回true
。 一樣。
我的經歷很糟糕...
你需要大約是更詳細的,因為不應該有一點需要注意isset
你描述它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.