什么时候empty()返回false而$ var ==''返回true?

时间:2017-02-09 09:21:26

标签: php

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

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的值。

2 个答案:

答案 0 :(得分:1)

在以下情况下,

empty()会返回true

  • 空字符串
  • 0整数
  • 0.0 float
  • 0 as string
  • 空数组
  • 空变量

(见http://php.net/empty

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

但可能还有其他几十起案件。因此,最好的办法是摆脱逻辑重复(if语句),并在TokenFinder中实现静态方法,如isDataValid,并用它来检查类外的数组。

答案 1 :(得分:-1)

PHP手册:

  

empty()如果​​var存在且非空,则返回FALSE非零   值。否则返回TRUE。