可能是PHP函数未定义的参数

时间:2015-02-09 17:04:52

标签: php arrays isset

在显示从数据库检索的值时,可能存在或不存在的值,我的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 );

......但当然,它没有。

1 个答案:

答案 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);