2016-02-19 75 views
2

比方說,我想檢查幾個不同的參數,然後回到默認值,有沒有辦法做到這一點,沒有難看和詳細的寫作isset()如何避免對'默認'值鏈的未定義索引警告?

例如,在JS,我們可以這樣做:

var someVariable = otherVar || anotherVar || 'fallback here';

PHP中的等價會是這樣的:

$someVariable = (isset($otherVar) ? $otherVar : (isset($anotherVar) ? $anotherVar : 'fallback here'));

這顯然是一個爛攤子和可怕的閱讀。

很多解決方案,爲單回退存在,即:

$someVariable = $otherVar ?: 'fallback here';

但是這並不能幫助我需要一個以上的支票的線。

鑑於我只關心該值是否設置或真值y(即我很高興1被接受爲使用的值,並且0/false/null被跳過並且對於要使用的鏈中的下一個參數),避免未定義索引警告的最佳方法是什麼?

實際上,我會在大多數的情況下對數組進行這樣的處理,但不是全部,也可能它們是不同的數組。我可能想爲第一個使用$ _POST,然後檢查另一個鍵下的$ _GET,然後回退到默認字符串。

+0

我曾經做過error_reporting(0);警告消失.. – rahul

+0

我使用error_reporting來檢查其他問題,所以我不想關閉它。 –

+0

我也不想壓制E_NOTICE,因爲我想從根本上解決問題,如果可能的話,而不是隻是將它的報告靜音。 –

回答

1

忽略PHP警告和通知並不是一個好主意。
但只是爲了實驗,我可以建議你錯誤控制運算符@
PHP支持一個錯誤控制運算符:at符號(@)。當在PHP中添加表達式時,可能會忽略可能由該表達式生成的任何錯誤消息。

$someVariable = @$otherVar ? @$var : 'fallback here'; 
echo $someVariable; 
// output: fallback here 

http://php.net/manual/en/language.operators.errorcontrol.php

+0

我不知道@操作符可以在使用變量之前使用;這真的很有趣,可能是一個很好的解決方案.. –

+0

我發現這不利於數組的情況下 - 例如: '$ animals = array(); $ my_animal = @ $ animals ['dog']? $ animals ['dog']:'有些狗的名字';' 這仍然會給我一個未定義的索引警告 - 有什麼方法可以繞過你知道的嗎? 替代方案非常冗長,我真的不喜歡它,並且需要花費一個月的星期天才能將其加入我的代碼中!: 'if(isset($ animals)&& isset($ animals [ 'dog'])){$ my_animal = $ animals ['dog']; }其他{$ my_animal ='一些狗的名字'; }' –

0

你可以鏈?:但你仍然需要suppress errors@

例如,下面將同樣工作,你的JavaScript示例:

$foo = @$bar ?: @$baz ?: @$qux ?: "I give up"; 

它的多個 「單回退」 相當於:

$foo = (@$bar ?: (@$baz ?: (@$qux ?: "I give up"))); 

不過要小心,?:僅檢查tr 012。有場景isset()和真諦do not agree。此外,PHP 5.3中引入了?:後備功能。

如果你只關心nullness並且有可用的PHP 7,它會引入一個null coalescing operator

+0

這是一個好點;例如,truthyness並不完全可以工作,因爲它會拒絕明確提供的布爾值false值。我喜歡這種風格,因爲它簡單明瞭,所以這是一種恥辱,不會奏效! –