Php not empty object

How to check that an object is empty in PHP?

Updated Answer (SimpleXMLElement):

If by empty you mean has no properties:

$obj = simplexml_load_file($url); if ( !$obj->count() ) < // no properties >
$obj = simplexml_load_file($url); if ( !(array)$obj ) < // empty array >

If SimpleXMLElement is one level deep, and by empty you actually mean that it only has properties PHP considers falsey (or no properties):

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

If SimpleXMLElement is more than one level deep, you can start by converting it to a pure array:

$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 >

Old Answer (simple object):

If you want to check if a simple object (type stdClass ) is completely empty (no keys/values), you can do the following:

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

Edit: added example

$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 

Solution 3

You can cast your object into an array, and test its count like so:

Solution 4

Imagine if the object is not empty and in a way quite big, why would you waste the resources to cast it to array or serialize it.

This is a very easy solution I use in JavaScript. Unlike the mentioned solution that casts an object to array and check if it is empty, or to encode it into JSON, this simple function is very efficient concerning used resources to perform a simple task.

function emptyObj( $obj ) < foreach ( $obj AS $prop ) < return FALSE; >return TRUE; > 

The solution works in a very simple manner: It wont enter a foreach loop at all if the object is empty and it will return true . If it’s not empty it will enter the foreach loop and return false right away, not passing through the whole set.

Solution 5

Using empty() won’t work as usual when using it on an object, because the __isset() overloading method will be called instead, if declared.

Читайте также:  Что такое qlistview python

Therefore you can use count() (if the object is Countable).

Or by using get_object_vars() , e.g.

get_object_vars($obj) ? TRUE : FALSE; 

Источник

Как определить пустой объект в PHP

stdClass – это объект PHP по умолчанию. У stdClass нет свойств, методов или родителя. Он не поддерживает магические методы и не реализует интерфейсов.

Когда вы бросаете скаляр или массив в Object, вы получаете экземпляр stdClass. Вы можете использовать stdClass всякий раз, когда вам нужен экземпляр универсального объекта.

Стандартный способ создания «пустого» объекта:

Но, с PHP> = 5.4, я лично предпочитаю использовать:

Это короче, и я лично считаю его более ясным, потому что stdClass может вводить в заблуждение начинающих программистов (т. Е. «Эй, я хочу объект, а не класс!» …).

(object)[] эквивалентен new stdClass() .

См. Руководство по PHP ( здесь ):

stdClass : Создано методом typecasting для объекта.

Если объект преобразован в объект, он не изменяется. Если значение любого другого типа преобразуется в объект, создается новый экземпляр встроенного класса stdClass .

Однако помните, что пустой ($ oVal) возвращает false , поскольку @PaulP сказал:

Объекты без свойств больше не считаются пустыми.

Что касается вашего примера, если вы пишете:

$oVal = new stdClass(); $oVal->key1->var1 = "something"; // PHP creates a Warning here $oVal->key1->var2 = "something else"; 

PHP создает следующее Предупреждение, неявно создающее свойство key1 (сам объект)

Предупреждение: создание объекта по умолчанию из пустого значения

Это может быть проблемой, если ваша конфигурация (см. Уровень отчетов об ошибках ) показывает это предупреждение в браузере. Это еще одна целая тема, но быстрый и грязный подход может использовать оператор управления ошибками (@), чтобы игнорировать предупреждение:

$oVal = new stdClass(); @$oVal->key1->var1 = "something"; // the warning is ignored thanks to @ $oVal->key1->var2 = "something else"; 

Я хочу отметить, что в PHP нет такой вещи, как пустой объект в смысле:

$obj = new stdClass(); var_dump(empty($obj)); // bool(false) 

но, конечно, $ obj будет пустым.

С другой стороны, пустой массив означает пустое в обоих случаях

$arr = array(); var_dump(empty($arr)); 

Цитата из журнала изменений функции пустой

Объекты без свойств больше не считаются пустыми.

php.net сказал, что это лучше всего:

$new_empty_object = new stdClass(); 

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

//JavaScript var myObj = < foo: "Foo value", bar: "Bar value" >; console.log(myObj.foo); //Output: Foo value 

Поэтому я всегда стараюсь писать такие объекты в PHP, как javascript :

//PHP >= 5.4 $myObj = (object) [ "foo" => "Foo value", "bar" => "Bar value" ]; //PHP < 5.4 $myObj = (object) array( "foo" =>"Foo value", "bar" => "Bar value" ); echo $myObj->foo; //Output: Foo value 

Но поскольку это в основном массив, вы не можете делать такие вещи, как присвоение анонимных функций свойству js:

//JavaScript var myObj = < foo: "Foo value", bar: function(greeting) < return greeting + " bar"; >>; console.log(myObj.bar("Hello")); //Output: Hello bar //PHP >= 5.4 $myObj = (object) [ "foo" => "Foo value", "bar" => function($greeting) < return $greeting . " bar"; >]; var_dump($myObj->bar("Hello")); //Throw 'undefined function' error var_dump($myObj->bar); //Output: "object(Closure)" 

Ну, вы можете это сделать, но ИМО не практична / чиста:

$barFunc = $myObj->bar; echo $barFunc("Hello"); //Output: Hello bar 

Кроме того, используя этот синтаксис, вы можете найти некоторые забавные сюрпризы , но отлично работает в большинстве случаев.

Читайте также:  Access object content javascript

В дополнение к ответу зомбата, если вы продолжаете забывать stdClass

$str=''; $array=array(); $object=object(); 

Вы можете использовать new stdClass() (который рекомендуется):

$obj_a = new stdClass(); $obj_a->name = "John"; print_r($obj_a); // outputs: // stdClass Object ( [name] => John ) 

Или вы можете преобразовать пустой массив в объект, который создает новый пустой экземпляр встроенного класса stdClass:

$obj_b = (object) []; $obj_b->name = "John"; print_r($obj_b); // outputs: // stdClass Object ( [name] => John ) 

Или вы можете преобразовать null значение в объект, который создает новый пустой экземпляр встроенного класса stdClass:

$obj_c = (object) null; $obj_c->name = "John"; print($obj_c); // outputs: // stdClass Object ( [name] => John ) 

для доступа к данным в stdClass аналогичным образом вы используете асоциальный массив, просто используйте синтаксис .

$myObj = new stdClass; $myObj->Prop1 = "Something"; $myObj->Prop2 = "Something else"; // then to acces it directly echo $myObj->; echo $myObj->; // or what you may want echo $myObj->; 

Как указывали другие, вы можете использовать stdClass. Однако я думаю, что он чище без (), вот так:

Однако, исходя из вопроса, кажется, что вы действительно хотите, чтобы иметь возможность добавлять свойства к объекту «на лету». Вам не нужно использовать stdClass для этого, хотя вы можете. Действительно, вы можете использовать любой класс. Просто создайте экземпляр объекта любого класса и начните устанавливать свойства. Мне нравится создавать свой собственный класс, чье имя просто o с некоторыми базовыми расширенными функциональными возможностями, которые я люблю использовать в этих случаях, и хорошо для распространения из других классов. В основном это мой собственный базовый класс объектов. Мне также нравится иметь функцию, просто называемую o (). Вот так:

Если вам не нравится иметь собственный тип базового объекта, вы можете просто вернуть o () новый stdClass. Одно из преимуществ заключается в том, что o легче запомнить, чем stdClass, и короче, независимо от того, используете ли вы его как имя класса, имя функции или и то, и другое. Даже если у вас нет кода внутри вашего класса o, его все же легче запомнить, чем неудобно заглавный и названный stdClass (который может вызвать идею «сексуально переданного класса болезни»). Если вы настроите класс o, вы можете найти использование функции o () вместо синтаксиса конструктора. Это нормальная функция, которая возвращает значение, которое меньше, чем конструктор. Например, имя функции может передаваться как строка функции, которая принимает вызываемый параметр. Функция также поддерживает цепочку. Таким образом, вы можете сделать что-то вроде: $ result = o ($ internal_value) -> some_operation_or_conversion_on_this_value ();

Читайте также:  Python dateutil parser parse

Это отличный старт для базового «языка» для создания других языковых слоев, когда верхний слой записывается в полные внутренние DSL. Это похоже на lisp-стиль разработки, и PHP поддерживает его лучше, чем большинство людей понимают. Я понимаю, что это немного касательно вопроса, но вопрос касается того, что я считаю основой для полного использования возможностей PHP.

Если вы хотите создать объект (например, в javascript) с динамическими свойствами, не получая предупреждение о неопределенном свойстве.

class stdClass < public function __construct(array $arguments = array()) < if (!empty($arguments)) < foreach ($arguments as $property =>$argument) < if(is_numeric($property)): $this-> = null; else: $this-> = $argument; endif; > > > public function __call($method, $arguments) < $arguments = array_merge(array("stdObject" =>$this), $arguments); // Note: method argument 0 will always referred to the main class ($this). if (isset($this->) && is_callable($this->)) < return call_user_func_array($this->, $arguments); > else < throw new Exception("Fatal error: Call to undefined method stdObject::()"); > > public function __get($name)< if(property_exists($this, $name)): return $this->; else: return $this-> = null; endif; > public function __set($name, $value) < $this-> = $value; > > $obj1 = new stdClass(['property1','property2'=>'value']); //assign default property echo $obj1->property1;//null echo $obj1->property2;//value $obj2 = new stdClass();//without properties set echo $obj2->property1;//null 

Вы также можете попробовать это.

Источник

Оцените статью