2015-02-09 115 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);