[php] PHP에서 객체가 비어 있는지 확인하는 방법은 무엇입니까?

PHP에서 객체가 비어 있는지 여부를 찾는 방법.

다음은 $objXML 데이터를 보유 하는 코드입니다 . 비어 있는지 여부를 어떻게 확인할 수 있습니까?

내 코드 :

$obj = simplexml_load_file($url);



답변

배열로 캐스팅 한 다음 비어 있는지 여부를 확인할 수 있습니다.

$arr = (array)$obj;
if (!$arr) {
    // do stuff
}


답변

편집 : 나는 그들이 SimpleXMLElement 객체가 비어 있는지 구체적으로 확인하고 싶어한다는 것을 깨닫지 못했습니다. 아래에 이전 답변을 남겼습니다.

업데이트 된 답변 (SimpleXMLElement) :

SimpleXMLElement의 경우 :

비어 있으면 속성이 없음을 의미합니다.

$obj = simplexml_load_file($url);
if ( !$obj->count() )
{
    // no properties
}

또는

$obj = simplexml_load_file($url);
if ( !(array)$obj )
{
    // empty array
}

SimpleXMLElement가 한 수준 깊이이고 비어 있으면 실제로 PHP가 거짓 (또는 속성 없음)으로 간주하는 속성 만 있음을 의미합니다 .

$obj = simplexml_load_file($url);
if ( !array_filter((array)$obj) )
{
    // all properties falsey or no properties at all
}

SimpleXMLElement가 한 수준 이상인 경우 순수한 배열로 변환하여 시작할 수 있습니다.

$obj = simplexml_load_file($url);
// `json_decode(json_encode($obj), TRUE)` can be slow because
// you're converting to and from a JSON string.
// I don't know another simple way to do a deep conversion from object to array
$array = json_decode(json_encode($obj), TRUE);
if ( !array_filter($array) )
{
    // empty or all properties falsey
}


이전 답변 (단순 개체) :

단순 객체 (유형 stdClass)가 완전히 비어 있는지 (키 / 값 없음) 확인하려면 다음을 수행 할 수 있습니다.

// $obj is type stdClass and we want to check if it's empty
if ( $obj == new stdClass() )
{
    echo "Object is empty"; // JSON: {}
}
else
{
    echo "Object has properties";
}

출처 : http://php.net/manual/en/language.oop5.object-comparison.php

편집 : 추가 된 예

$one = new stdClass();
$two = (object)array();

var_dump($one == new stdClass()); // TRUE
var_dump($two == new stdClass()); // TRUE
var_dump($one == $two); // TRUE

$two->test = TRUE;
var_dump($two == new stdClass()); // FALSE
var_dump($one == $two); // FALSE

$two->test = FALSE;
var_dump($one == $two); // FALSE

$two->test = NULL;
var_dump($one == $two); // FALSE

$two->test = TRUE;
$one->test = TRUE;
var_dump($one == $two); // TRUE

unset($one->test, $two->test);
var_dump($one == $two); // TRUE


답변

객체를 배열로 캐스트하고 다음과 같이 개수를 테스트 할 수 있습니다.

if(count((array)$obj)) {
   // doStuff
}


답변

객체가 비어 있지 않고 상당히 크지 않은 경우 배열 또는 직렬화에 리소스를 낭비하는 이유는 무엇입니까?

이것은 JavaScript에서 사용하는 매우 쉬운 솔루션입니다. 객체를 배열로 캐스트하고 비어 있는지 확인하거나 JSON으로 인코딩하는 언급 된 솔루션과 달리이 간단한 함수는 간단한 작업을 수행하는 데 사용되는 리소스와 관련하여 매우 효율적입니다.

function emptyObj( $obj ) {
    foreach ( $obj AS $prop ) {
        return FALSE;
    }

    return TRUE;
}

이 솔루션은 매우 간단한 방식으로 작동합니다. 객체가 비어 있으면 foreach 루프에 전혀 들어 가지 않고 true. 비어 있지 않으면 foreach루프에 들어가서 false전체 세트를 통과하지 않고 즉시 돌아옵니다 .


답변

사용 empty()때문에, 객체에 그것을 사용하는 경우 정상적으로 작동하지 않습니다 __isset()선언 된 경우 오버로드 메소드가 대신 호출됩니다.

따라서 count()(객체가 Countable 인 경우) 사용할 수 있습니다 .

또는 사용하여 get_object_vars()예를 들어

get_object_vars($obj) ? TRUE : FALSE;


답변

캐스팅 할 필요가없는 또 다른 가능한 솔루션 array:

// test setup
class X { private $p = 1; } // private fields only => empty
$obj = new X;
// $obj->x = 1;


// test wrapped into a function
function object_empty( $obj ){
  foreach( $obj as $x ) return false;
  return true;
}


// inline test
$object_empty = true;
foreach( $obj as $object_empty ){ // value ignored ... 
  $object_empty = false; // ... because we set it false
  break;
}


// test    
var_dump( $object_empty, object_empty( $obj ) );


답변

개체가 비어 있는지 확인하는 고유 한 안전한 방법은 없습니다.

PHP의 count ()는 먼저 배열로 캐스팅하지만 캐스팅은 빈 배열을 생성 할 수 있으며 객체가 구현되는 방법에 따라 다릅니다 (확장자의 객체는 종종 이러한 문제의 영향을받습니다)

귀하의 경우에는 $ obj-> count ();

http://it.php.net/manual/en/simplexmlelement.count.php

(이것은 php의 카운트가 아닙니다. http://www.php.net/count )