3 回答

TA貢獻1807條經驗 獲得超9個贊
我想出了檢查是否設置了任何變量的新想法。然而,正如 deceze 提到的那樣,這是不可能的,但這種方式更容易列出您要檢查的所有變量。但這仍然不是實現它的非常優雅的方法,因為沒有很好的方法來做到這一點。
null
在鏈的末尾返回很重要,因為它會以其他方式顯示不存在的數組元素的通知。
$var3 = 'test';
$var4['4'] = false;
$var4['3'] = null;
var_dump(!is_null($var1 ?? $var2 ?? $var3 ?? $var4['4'] ?? null)); //true
var_dump(!is_null($var1 ?? $var2 ?? $var3 ?? null)); //true
var_dump(!is_null($var1 ?? $var2 ?? null)); //false
var_dump(!is_null($var1 ?? $var2 ?? $var4['3'] ?? null)); //false
var_dump(!is_null($var1 ?? $var2 ?? $var4['5'] ?? null)); //false

TA貢獻1816條經驗 獲得超6個贊
isset如果變量null根本不存在,則在抑制通知時檢查變量是否存在。
無法創建像isset. 用戶定義的函數只能接受值,不能接受“變量”。該值必須在調用方解析,因此一個不存在的變量將始終在那里生成一個通知,并且您的函數無法執行任何操作來抑制它。isset是一種“語言構造”,它更像是一個運算符而不是一個函數,并且沒有辦法模仿它在用戶態代碼中的作用。在某些特殊情況下,您可以實施一些解決方法,例如使用全局變量,但在其他情況下這些方法將失敗,例如當您不使用全局變量時。
從根本上說,您一開始就不必過多地處理不存在的變量。您的代碼完全控制它創建的變量,因此如果您定義變量,則無需檢查它們是否存在。任何動態的東西都應該作為數組或對象傳遞,例如用戶輸入通過$_GET或$_POST或其他可以作為對象傳遞的數據結構。然后你不再談論isset,而是關于測試數組中鍵的存在,例如,這可以簡化,例如:
if (array_intersect_key($array, array_flip(['foo', 'bar', 'baz']))) {
echo 'At least one of those keys was in $array';
}
因此,避免陷入需要首先檢查是否設置了某些變量的情況。如果您不可避免地處于這種情況,那么isset || isset || ....

TA貢獻1752條經驗 獲得超4個贊
我不完全確定這是否是解決此問題的最佳方法......您可以只將變量名傳遞給函數而不是變量。
//$var1 = 1;
//$var2 = 2;
//$var3 = 3;
function orset()
{
foreach (func_get_args() as $arg) {
global ${$arg};
if (isset(${$arg})) {
return true;
}
}
return false;
}
if (orset('var1', 'var2', 'var3')) {
echo "ok";
}
為什么要抑制錯誤?將未定義的變量傳遞給函數應該產生一個通知。如果您忘記了抑制錯誤(您應該這樣做),您可以使用:
function orset()
{
foreach (func_get_args() as $arg) {
global $arg;
if (isset($arg)) {
return true;
}
}
return false;
}
if (orset($var1, $var2, $var3)) {
echo "ok";
}
當您可以簡單地使用 if (isset($var1) || isset($var) ....
- 3 回答
- 0 關注
- 154 瀏覽
添加回答
舉報