如何在PHP中检查对象是否为空?

问题描述 投票:82回答:11

如何在PHP中查找对象是否为空。

以下是$obj持有XML数据的代码。如何检查它是否为空?

我的代码:

$obj = simplexml_load_file($url);
php object
11个回答
104
投票

您可以强制转换为数组,然后检查它是否为空

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

编辑:单行类型转换,如下所示,在PHP 5.4中不起作用:

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

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

要么

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

-1
投票

我在post请求中使用了字符串的json_decode。以上都没有为我工作,最后我使用了这个:

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

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

28
投票

编辑:我没有意识到他们想要专门检查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 considers falsey(或没有属性):

$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

12
投票

您可以将对象转换为数组,并测试其计数如下:

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

7
投票

另一个可能的解决方案,不需要铸造到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 ) );

7
投票

想象一下,如果对象不是空的并且方式非常大,为什么要浪费资源将其转换为数组或序列化...

这是我在JavaScript中使用的一个非常简单的解决方案。与上面提到的将对象转换为数组并检查它是否为空的解决方案或将其编码为JSON的解决方案不同,这个简单的函数在使用资源执行简单任务时非常有效。

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

    return TRUE;
}

该解决方案以一种非常简单的方式工作:如果对象为空它将返回一个foreach循环,它将返回true。如果它不是空的,它将进入foreach循环并立即返回false,而不是通过整个集合。


6
投票

在对象上使用时,使用empty()将无法正常工作,因为如果声明,将调用__isset()重载方法。

因此你可以使用count()(如果对象是Countable)。

或者通过使用get_object_vars(),例如

get_object_vars($obj) ? TRUE : FALSE;

2
投票

没有唯一的安全方法来检查对象是否为空

php的count()首先转换为数组,但是转换可以产生一个空数组,取决于对象的实现方式(扩展的对象经常受这些问题的影响)

在你的情况下,你必须使用$ obj-> count();

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

(这不是php的计数http://www.php.net/count


1
投票

如果你在PHP中使用(bool)转换任何东西,它会立即告诉你该项是一个对象,原始类型还是null。使用以下代码:

$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!";
}

0
投票

如果一个对象是“空”或者不是一个定义的问题,并且因为它取决于该类所代表的对象的性质,那么它就是由类来定义的。

PHP本身认为类的每个实例都不是空的。

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

// results in bool(false)

“空”对象不能有通用定义。你可能会在上面的例子中争论empty()的结果应该是true,因为该对象不代表任何内容。但PHP怎么知道?有些对象从不意味着代表内容(例如工厂),其他对象总是代表一个有意义的价值(想想new DateTime())。

简而言之,您必须为特定对象提出自己的标准,并相应地测试它们,无论是从对象外部还是从对象中自编写的isEmpty()方法。

© www.soinside.com 2019 - 2024. All rights reserved.