7

如果你对一个没有元素的数组执行 empty() ,你会得到真实的。但是,如果你对一个计数为 0 的 Countable 对象执行 empty() ,那么你会得到错误。在我看来,一个 0 计数 Countable 应该被认为是空的。我错过了什么吗?

<?php

class Test implements Countable
{
    public $count = 0;

    public function count ()
    {
        return intval (abs ($this -> count));
    }
}

$test = new Test ();

var_dump (empty ($test));
var_dump (count ($test));

$test -> count = 10;

var_dump (empty ($test));
var_dump (count ($test));

我本来希望第一次调用 empty 会返回 true,但事实并非如此。

出现这种情况是否有合理的理由,或者它是一个错误?

4

2 回答 2

8

文档

Returns FALSE if var has a non-empty and non-zero value.

The following things are considered to be empty:

* "" (an empty string)
* 0 (0 as an integer)
* 0.0 (0 as a float)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

我认为$test在你的情况下仍然被认为是一个Object,它不在什么空会返回的列表中TRUE

于 2012-05-25T10:13:28.860 回答
5

如上所述,empty()不认为count($obj) == 0是“空的”。这不能按预期工作的原因是因为数组没有实现Countableie

array() instanceof Countable // false

可能是一个明显的解决方法,但我想我会在这里发布。

function is_empty ($val) {
  return empty($val) || ($val instanceof Countable && empty(count($val)));
}

例子:

class Object implements Countable {

  protected $attributes = array();

  // ...

  public function count () {
    return count($this->attributes);
  }

}

$obj = new Object();
is_empty($obj) // TRUE

我应该注意到这个解决方案在我的情况下是有效的,因为我已经定义is_empty()了与其他is_*方法一起的漂亮。

于 2016-01-11T18:37:33.340 回答