2017-02-09 84 views
0

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

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()方法异常被触发。我通过这段代码运行了失败消息中的所有收件人,并且异常不会触发。自抛出Exception以来数据没有改变。这是一个奇怪的。

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

+2

http://stackoverflow.com/questions/25100890/in-php-why-empty0-returns-true – fizzi

+1

这样的问题很好的例子,为什么总是使用'==='而不是'=='像PHP和JavaScript等语言,以确保您检查严格的平等。 – Simba

+1

可能重复[在PHP中,为什么空(“0”)返回true?](http://stackoverflow.com/questions/25100890/in-php-why-empty0-returns-true) – DarkBee

回答

1

empty()返回true在的情况下:

  • 空字符串
  • 0整数
  • 0.0浮子
  • 0作为字符串
  • 空数组
  • 空可变

(见http://php.net/empty

误差必须位于php的棘手类型杂耍。可能是,$result['email_address']$result['mobile_numer']包含一个对象,其中__toString实现返回一个空字符串。 emtpy将看到一个对象,== ''看到一个空字符串。

虽然可能有几十个其他案例。所以你最好的办法是摆脱逻辑重复(if语句),并在TokenFinder(如isDataValid)中实现一个静态方法,并用它来检查类之外的数组。

+0

感谢您的建议。我同意代码需要在这个领域重新工作。它在我们的待办事项清单上。感谢您的建议以及对象的想法。我不认为这是真正的问题,但它肯定有助于提出其他类似的情况。 –

-1

PHP手册:

空()如果变种存在,并且有一个非空的,非零值 返回FALSE。否则返回TRUE。

相关问题