如何最好地检查 PHP 中的字符串以避免警告



简单的问题,但它一直出现...在 PHP 中检查变量的最佳方法是什么。 寻求意见/建议。在下面的示例中,假设$pricing可能未定义、正确定义为"价格"或错误地定义为 array(( 等。

//Method A ?
echo (!empty($pricing) && (string) $pricing == 'price' ? 'selected="true"' : '');
//Method B ?
echo (isset($pricing) && $pricing == 'price' ? 'selected="true"' : '');
// Method C ?
/// your idea ?

方法 C:不要在此表达式中处理未定义或类型错误的$pricing

当您在代码中达到此表达式时,您应该已经验证了要使用的变量是否存在并检查了其类型,如果它不是它应该的样子,则抛出异常,无论您是显式执行此操作还是通过方法中的类型声明执行此操作。

通过将其强制转换为字符串,或者在不存在时忽略它,您可能会掩盖应该导致异常的潜在问题。如果它不是字符串,则代码中较早出现问题,您需要修复。

所以只要让你的表情做一件事,而不是多件事。

echo $pricing == 'price' ? 'selected="true"' : '';

然后,如果您在错误日志中看到未定义的变量通知,请返回并在源(即定义或应该定义$pricing的位置(解决问题。

如果你使用的是 PHP 7+,你有 null-coalesce 运算符 (??( 来压缩表达式:

($pricing ?? '') === 'price' and print 'selected="true"';

在 3v4l.org 在线试用。

让我们分解一下:

  • ($pricing ?? '')优雅地处理尚未定义$pricing的情况。如果已定义,此表达式返回定义的值$pricing:否则,它返回空字符串''
  • === 'price'将现在定义的值与我们正在寻找的值进行比较。当然,您可以扩展此测试。例如,如果您有一组定义的值,则可以改用in_array检查。
  • and print 'selected="true"'对先前测试的布尔结果做出反应,在匹配的情况下打印所需的值。由于输出空字符串相当于根本没有输出,我们可以简单地使用and逻辑运算符有条件地输出。请注意,echo不能在这里使用,因为它是一种语言结构。而是使用printprintfvar_dump等。

也就是说,默认可能未定义的值的新兴习惯用法使用 null 合并运算符,如下所示:

$pricing = ($pricing ?? '');

我建议以这种方式默认,而不是上面给出的内联检查,因为它确保从该位置开始定义$pricing。换句话说,不要用($pricing ?? '') === 'price'检查乱扔你的代码:只需做一次并完成它。


顺便说一句,如果您想在这种情况下做件事,您可以使用匿名待命:

($pricing ?? '') === 'price' and (function() {
echo 'this';
echo 'that';
})();

但我不推荐这些体操。

我会这样写:

echo (isset($pricing) && $pricing === 'price' ? 'selected="true"' : '');

这将完成以下操作:

  • 条件计算结果为false(如果未定义$pricing
  • 如果条件$pricing'price'不同,则条件计算结果为false

最后,您正在与特定值进行比较,该值以外的任何值都将等同于 false,因此在这种情况下检查!empty()是多余的。

但是,请务必使用严格的(===(比较,因为if("some string" == 0)将返回"true(源("。

编辑:此外,如果您不确定是否已定义变量(例如,使用 $_POST 时(,使用isset()将为您省去很多麻烦。

相关内容

最新更新