Как проверить, что объект пуст в PHP?

Как найти, является ли объект пустым или нет в PHP.

Ниже приведен код, в котором $obj хранит данные XML. Как я могу проверить, пуст ли он или нет?

Мой код:

$obj = simplexml_load_file($url);

Ответ 1

Вы можете использовать массив, а затем проверить, пуст он или нет.

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

Изменить: однострочное typecasting, как показано ниже, не работает в PHP 5.4:

if (empty((array) $obj)) {
    //do stuff
}

Ответ 2

Изменить. Я не понимал, что они хотят конкретно проверить, пуст ли объект 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 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

Ответ 3

Еще одно возможное решение, которое не нуждается в литье в 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 ) );

Ответ 4

Вы можете преобразовать свой объект в массив и проверить его так:

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

Ответ 5

Использование empty() не будет работать как обычно при использовании его на объекте, потому что вместо него будет вызываться метод перегрузки __isset(), если он объявлен.

Поэтому вы можете использовать count() (если объект Countable).

Или используя get_object_vars(), например

get_object_vars($obj) ? TRUE : FALSE;

Ответ 6

Это очень простое решение, которое я использую в JavaScript. В отличие от упомянутого решения, которое бросает объект в массив и проверяет, является ли оно пустым, или для его кодирования в JSON, эта простая функция очень эффективна в отношении используемых ресурсов для выполнения простой задачи.

function emptyObj($obj) {
    foreach ($obj as $k) {
        return false;
    }
    return true;
}

Решение работает очень просто: он вообще не будет вводить цикл foreach, если объект пуст, и он вернет true. Если он не пуст, он войдет в цикл foreach и сразу вернет false, а не через весь набор.

Уже есть правильный ответ, но я отправляю его снова. Я понимаю, что PHP - это грязный язык, но cmon guys... Представьте себе, если объект не пуст и в каком-то смысле довольно большой, зачем вам тратить ресурсы, чтобы отбросить его на массив или сериализовать его...

Ответ 7

нет уникального безопасного способа проверить, является ли объект пустым

php count() сначала приводит к массиву, но литье может создавать пустой массив, зависит от того, как реализуется объект (объекты объектов расширения часто затрагиваются этими проблемами)

в вашем случае вам нужно использовать $obj- > count();

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

(это не php count http://www.php.net/count)

Ответ 8

Если вы делаете что-либо в PHP как (bool), он сразу же скажет вам, является ли объект объектом, примитивным типом или нулевым. Используйте следующий код:

$obj = simplexml_load_file($url);

if (!(bool)$obj) {
    print "This variable is null, 0 or empty";
} else {
    print "Variable is an object or a primitive type!";
}

Ответ 9

Если объект "пуст" или нет, это вопрос определения, и поскольку он зависит от характера объекта, который представляет класс, он должен определить класс.

PHP сам рассматривает каждый экземпляр класса как не пустой.

class Test { }
$t = new Test();
var_dump(empty($t));

// results in bool(false)

Не может быть общего определения для "пустого" объекта. В приведенном выше примере вы можете утверждать, что результат empty() должен быть true, потому что объект не представляет никакого содержимого. Но как PHP знать? Некоторые объекты никогда не предназначены для представления контента (например, на заводе-изготовителе), другие всегда представляют значимое значение (подумайте new DateTime()).

Короче говоря, вам придется придумать свои собственные критерии для конкретного объекта и проверить их соответственно, либо вне объекта, либо из самозанятого метода isEmpty() в объекте.

Ответ 10

$array = array_filter($array);
if(!empty($array)) {
    echo "not empty";
}

или

if(count($array) > 0) {
    echo 'Error';
} else {
    echo 'No Error';
}

Ответ 11

Я использовал json_decode строки в почтовом запросе. Ни один из вышеперечисленных не работал у меня, в конце я использовал это:

$post_vals = json_decode($_POST['stuff']);

if(json_encode($post_vals->object) != '{}')
{
    // its not empty
}