Intereting Posts
Безопасное хранение конфиденциальных данных в базе данных Как конвертировать видео с помощью ffmpeg Возможно ли иметь два класса с тем же именем, если они находятся в разных папках? Хранение документа JSON в DynamoDB с использованием PHP AWS SDK Codeigniter, создавать таблицы и пользователей для MySQL переместить symfony2 NotFoundHttpException в другой файл Как получить дату следующего месяца с сегодняшней даты и вставить ее в мою базу данных? Как получить доступ к члену stdClass в PHP, который начинается с @ Что является относительно безопасным способом использования файла cookie для входа? Получение долговременного токена доступа с помощью setExtendedAccessToken () возвращает краткосрочный токен Не удалось подключиться к серверу PostgreSQL Разметка разметки в абстрактном дереве синтаксиса с использованием регулярного выражения Обработать класс PHP, который реализует Iterator как массив Лучший способ защитить от инъекций mysql и межсайтового скриптинга Заменить запятую (,) с помощью точки (.) RegEx php

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

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

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

Мой код:

 $obj = simplexml_load_file($url); 

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

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

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

 if (empty((array) $obj)) { //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 

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

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

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

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

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

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

 get_object_vars($obj) ? TRUE : FALSE; 

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

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

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

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

нет единственного безопасного способа проверить, нет ли объекта

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

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

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

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

Если вы нарисуете что-нибудь в 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!"; } 

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

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

 class Test { } $t = new Test(); var_dump(empty($t)); // results in bool(false) 

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

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

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

или

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

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

 $post_vals = json_decode($_POST['stuff']); if(json_encode($post_vals->object) != '{}') { // its not empty }