【问题标题】:How do best check a string in PHP to avoid warnings如何最好地检查 PHP 中的字符串以避免警告
【发布时间】:2017-08-08 19:28:12
【问题描述】:

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

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

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

// Method C ?
/// your idea ?

【问题讨论】:

  • empty() 通常更好,但在这种情况下它并不重要,因为无论如何您都将其设置为空字符串。
  • @GrumpyCrouton 我不喜欢这样想,因为我仍然想要更清晰,而不是只使用其中的哪一个(因为我不是在问结果)。
  • 链接的答案说明了这两个函数之间的区别。

标签: php


【解决方案1】:

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

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

通过将其转换为字符串,或者如果它不存在则忽略它,您可能会掩盖应该导致异常的潜在问题。如果它不是一个字符串,那么您的代码前面出现了问题,您需要修复。

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

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

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

【讨论】:

  • 好吧,我认为依靠警告进行调试似乎不是一个好主意。无论如何,您很可能仍需要跟踪这些值。为什么不检查正确性并在此处输出该问题或其他内容?像 C++ 的 assert() 等。?
  • 是的,如果我理解正确,我想我同意,而且。这基本上就是我在答案的第一部分要说的。我只是说,在我看来,应该在你准备好生成输出之前进行检查。并且像这样使用emptyisset 不会进行检查。它只会使表达式短路,因此根本不会评估 $pricing
【解决方案2】:

如果您使用的是 PHP 7+,则可以使用 null-coalesce operator (??) 来压缩表达式:

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

Try it online at 3v4l.org.

让我们分解一下:

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

也就是说,defaulting 潜在未定义值的新兴习惯用法使用 null-coalesce 运算符,例如:

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

我建议以这种方式默认,而不是上面给出的内联检查,因为它确保$pricing 是从那个位置定义的。换句话说,不要在代码中乱扔($pricing ?? '') === 'price' 检查:只需执行一次即可完成。


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

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

但我不推荐这些体操。

【讨论】:

    【解决方案3】:

    我会这样写:

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

    这完成了以下工作:

    • 如果 $pricing 未定义,则条件评估为 false
    • 如果$pricing'price' 不同,则条件评估为false

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

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

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

    【讨论】:

    • 仍然生成“未定义变量:定价”
    • @GrumpyCrouton 我假设 OP 使用的是用户定义的变量,相应地编辑了答案
    • 这会导致诸如“PriCe”或“prIcE”之类的事情失败并且仍然抛出警告......
    • @Mike Q 你是对的,但它是否应该失败取决于具体情况
    • @localheinz 感谢您的编辑!虽然我不认为检查is_string() 真的很有必要,因为=== 也会检查它是否是正确的类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多