2015-02-09 153 views
4

在顯示可能或可能不存在從數據庫檢索的值,值,我的PHP代碼有很多這樣的:可能-未定義參數PHP函數

if (isset($data['a'])) 
    $a = number_format($data['a']); 
else 
    $a = '–'; 
if (isset($data['b'])) 
    $b = number_format($data['b']); 
else 
    $b = '–'; 

(簡體例如; $data['a']實際上是例如$data[$date][$part]['errors'])。之後是<td><?= $a ?></td><td><?= $b ?></td>

使用?:而不是if使代碼垂直更緊湊但更醜陋。我想把這個功能,所以我可以有

$a = someFunction($data['a']); 
$b = someFunction($data['b']); 

而不是,這是更好。但是,將一個未設置的變量作爲函數參數會導致兩個警告,一個用於unset變量,另一個用於缺少函數參數。如果我做了明顯的作用,並與@稱之爲...

function formatIfAvail($num, $dec = 0) 
{ 
    if (isset($num)) 
     return number_format($num, $dec); 
    return '–'; 
} 

.... 

$a = @formatIfAvail($data['a']); 

...它工作,但是這似乎是一個不好解決。 有沒有辦法做到這一點,沒有任何@如果PHP有C++預處理程序我會用的#define這樣的事情...

#define NUMFMT(n, d) (isset(n) ? number_format(n, d) : '–') 

.... 

$a = NUMFMT($data['a'], 0); 

...但當然,事實並非如此。

+0

在變量中使用@而不是在函數中。有些函數(@ $ data ['a']) – 2015-02-09 17:08:30

+0

除了使用@或者帶錯誤報告功能的全局方式外,沒有辦法抑制警告 – 2015-02-09 17:09:36

+0

你怎麼不知道'data ['a']'是否存在?您不應該忽略輸入檢查,特別是如果您的數據是用戶輸入的話。 – Halcyon 2015-02-09 17:13:25

回答

0

PHP會在整個語言中發出警告。作爲語言,它有很多怪癖和補丁,使得好看(好看)的代碼是不可能的。

說,取回東西一樣$data['a']$data[$date][$part]['errors']會產生至少一個警告,如果出現了錯誤的值檢索。我說「至少」,因爲它通常取決於接口(它定義了方括號運算符的用法)的實現,但正常的數組將在最常見的條件下觸發通知。

所以,你可以在全球關閉通知和警告:

error_reporting(E_ALL & ~(E_NOTICE | E_WARNING)); 

但是,也許你不想做的,在全球範圍,但只是局部到您的通話/代碼塊。這就是@操作符(語法上很醜)的地方。您可以在不發出警告的情況下檢索該值:

$myValue = @$data['a']; 
$myValue = @$data[$date][$part]['errors']; 

而且您不會收到任何警告。

在正常情況下,你要評估:

$myValue = @$data['a'] or $anotherValue; 

要做到這一點,在PHP中你必須使用醜陋 Elvis操作符(我同意你的看法):

$myValue = @$data['a'] ?: $anotherValue; 

,因爲這樣做它與or||)會給你一個布爾值。

此外,您遇到了另一個問題:您不僅僅試圖獲取「或」默認值。正如我在代碼中看到的那樣,如果值存在或者返回一個默認值,您試圖轉換一個值。 PHP不支持壓縮的(我不知道任何支持它的語言)。

所以你堅持你所知道的。我更喜歡這樣的:

function someFunction($num, $dec = 0) 
{ 
    return ($number !== null) ? number_format($num, $dec) : '-'; 
} 
$myVal = someFunction(@data['a'] ?: null);