在显示从数据库检索的值时,可能存在或不存在的值,我的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 :(得分:0)
PHP会在整个语言中发出警告。作为语言,它有很多怪癖和补丁,使得很好(好看)的代码很难不可能。
说,如果在值检索中出现问题,检索$data['a']
或$data[$date][$part]['errors']
之类的内容会产生至少警告。我说&#34;至少&#34;因为它通常取决于ArrayAccess
接口(定义方括号运算符的用法)的实现,但正常数组会在最常见的条件下触发通知。
因此,您可以全局关闭通知和警告:
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
(||
)进行操作会给你一个布尔值。
此外,您还遇到了另一个问题:您不只是试图获得价值&#34;或者#34;默认值。正如我在您的代码中看到的那样,如果值存在,您将尝试转换值,或者返回默认值。 PHP不支持压缩方式(我不知道任何支持它的语言)。
所以你依旧坚持自己所知道的。我喜欢这样:
function someFunction( $num, $dec = 0 )
{
return ($number !== null) ? number_format( $num, $dec ) : '-';
}
$myVal = someFunction(@data['a'] ?: null);