【问题标题】:Possibly-undefined argument to PHP functionPHP函数可能未定义的参数
【发布时间】:2015-04-09 12:19:44
【问题描述】:

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

相反,这要好得多。但是将未设置变量作为函数参数会导致两个警告,一个是未设置变量,另一个是缺少函数参数。如果我做明显的功能并用@调用它...

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

...但当然不是。

【问题讨论】:

  • 在变量中使用@,而不是在函数中。 someFunction(@$data['a'])
  • 除了使用@或带有错误报告功能的全局方式之外,没有其他方法可以抑制警告
  • 你怎么不知道data['a']是否存在?您不应该掩盖输入检查,尤其是当您的数据是用户输入时。
  • 通过引用传递 var:formatIfAvail( & $num, $dec = 0 )。你不会收到通知。
  • 不推荐通过调用时引用传递

标签: php arrays isset


【解决方案1】:

PHP 会在整个语言中发出警告。作为一种语言,它有很多怪癖和补丁,以至于制作漂亮(好看)的代码几乎是不可能的。

也就是说,如果值检索出现问题,检索 $data['a']$data[$date][$part]['errors'] 之类的内容将至少生成警告。我说“至少”是因为它通常取决于ArrayAccess 接口的实现(它定义了方括号运算符的用法),但普通数组会在最常见的情况下触发通知。

因此,您可以全局关闭通知和警告:

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

但也许您不想在全局范围内这样做,而只是在本地调用/代码块。这就是 @ 运算符(语法丑陋)发挥作用的地方。您可以在没有警告的情况下检索该值:

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

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

在您要评估的正常条件下:

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

为此,在 PHP 中你必须使用 ugly elvis 运算符(我同意你的观点):

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

因为使用or (||) 会得到一个布尔值。

此外,您还遇到了另一个问题:您不只是试图获取一个值“或”一个默认值。正如我在您的代码中看到的那样,您正在尝试转换一个值(如果该值存在)或返回一个默认值。 PHP 不支持压缩方式(我不知道有什么语言支持它)。

所以你被你所知道的东西困住了。我更喜欢这样:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 2011-10-21
    • 2020-10-18
    相关资源
    最近更新 更多