2012-05-25 4 views
4

요소가없는 배열에서 empty()를 수행하면 사실을 알 수 있습니다. 그러나 카운트가 0 인 Countable 객체에서 empty()를 수행하면 false가 반환됩니다. 나에게 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)); 

첫 번째 호출에서 true를 반환하는 것으로 예상 했겠지만 실제로는 반환되지 않습니다.

합당한 이유가 있을까요? 아니면 버그입니까? docs에서

+0

PHP 매뉴얼은 명시 적으로 * emptyness *를 정의하고'Countable'에 대해서는 언급하지 않습니다. 내가 모바일에 없다면 나는 링크를 제공 할 것이다. –

답변

6

:

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) 

나는 여전히 위의 언급 한 바와 같이 TRUE

+0

좋아요, 설명서에 명시 적으로이 특별한 경우에 무엇을 기대해야할지 모르겠군요. – GordonM

+0

@ GordonM 나는 이런 식으로 각 구석을 지정할 때 어려울 것이라고 생각합니다. 가장 안전한 것은 무엇일까요? TRUE를 반환하고 목록에없는 모든 것에 대해 FALSE를 올바르게 반환합니다. –

+4

Countable이 0 인 경우에도 Countable이 빈 것으로 간주되지 않는다는 메모 만 표시됩니다. – GordonM

2

로 반환 빈 것의 목록에없는 어떤 Object 간주됩니다 귀하의 경우 $test 생각, 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_* 방법과 함께 귀여움을 위해 is_empty() 정의 때문에 내가주의해야한다.