簡體   English   中英

用PHP中的isset()替換array_key_exists()

[英]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']); 

這些都做完全相同的事情。 如果值存在並且其值不為nullisset返回true 如果數組鍵存在並且其值不為null則第二行返回true 一樣。

我的經歷很糟糕...

你需要大約是更詳細的,因為不應該有一點需要注意isset你描述它。

請參閱《 PHP的isset和empty權威指南》以及isset和array_key_exists之間的區別

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM