【问题标题】:When would empty() return false and $var == '' return true?empty() 什么时候返回 false 而 $var == '' 返回 true?
【发布时间】:2017-02-09 09:21:25
【问题描述】:

遇到了一个有趣的问题。在一些遗留代码中,我们有以下语句。

if (empty($result['email_address']) && empty($result['mobile_number'])) {
    $token = '';
} else {
    $tokenFinder = new TokenFinder();
    $tokenFinder->setEmailAddress($result['email_address']);
    $tokenFinder->setMobileNumber($result['mobile_number']);
    $token = $tokenFinder->generate();
}

令牌查找器的相关位如下所示:

class TokenFinder{

    public function setEmailAddress($email) {
        $this->email = $email;
    }

    public function setMobileNumber($mobile) {
        $this->mobile = $mobile;
    }

    public function generate(){
        if ($this->email == '' && $this->mobile == ''){
            Throw new Exception('TokenFinder: You cannot fetch a token with no email or mobile number');
        }

昨天,有史以来第一次,generate() 方法中的异常被触发。我已经通过这段代码运行了失败消息中的所有收件人,并且没有触发异常。自抛出异常以来,数据没有改变。这是一个奇怪的。

有谁知道会导致 empty($var) 评估为 false 和 $var == '' 评估为 true 的任何值。

【问题讨论】:

  • 这样的问题是很好的例子,为什么在 PHP 和 JavaScript 等语言中使用 === 而不是 == 总是更好,以确保您检查严格相等。
  • 我试过这个。 $a=数组(); var_dump(空($a)); o/p 是布尔值(真)。并且 $a=='' 是假的。因此,您的输入可能需要在检查之前进行修剪和过滤。

标签: php


【解决方案1】:

empty() 在以下情况下返回true

  • 空字符串
  • 0 个整数
  • 0.0 浮点数
  • 0 作为字符串
  • 空数组
  • 空变量

(见http://php.net/empty

错误一定在于 php 的棘手类型杂耍。可能是,$result['email_address']$result['mobile_numer'] 包含一个对象,__toString 实现返回一个空字符串。 emtpy 会看到一个对象,== '' 会看到一个空字符串。

但可能还有许多其他情况。因此,最好的办法是摆脱逻辑重复(if 语句),并在 TokenFinder 中实现一个静态方法,例如 isDataValid,并使用它来检查类外的数组。

【讨论】:

  • 感谢您的建议。我同意代码需要在这方面进行修改。它在我们的待办事项清单上。感谢您的建议以及对象的想法。我不认为这是真正的问题,但它肯定有助于提出其他类似的情况。
【解决方案2】:

PHP 手册:

empty() 如果 var 存在并且具有非空、非零值,则返回 FALSE 价值。否则返回 TRUE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2012-05-21
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多