7

要素が含まれていない配列でempty()を実行すると、trueになります。ただし、カウントが0のCountableオブジェクトでempty()を実行すると、falseになります。私には、0カウントの可算は空であると見なされるべきであるように思われます。私は何かが足りないのですか?

<?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これが期待どおりに機能しない理由は、配列が実装されていないためですCountable

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 に答える