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


Answers:


130

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

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

9
类型转换对我不起作用,因为我得到了以下错误: PHP解析错误:语法错误,...中出现意外的'(array)'(array)(T_ARRAY_CAST)... 我使用PHP 5.4.28版本,第一个选项与两行代码对我有用。
柯安达

上载WordPress插件时发生了相同的错误,似乎他们还使用了旧版本的PHP。
Asaf 2015年

4
empty实际上不会检查数组是否为空,empty($var)等效于(!isset($var) || !$var)。您可以将替换为empty($arr)!$arr因为array() == FALSE
蒂莫西·佐恩

2
原因empty((array) $obj)在PHP 5.4+中不起作用与单行类型转换无关。之所以empty()会出现错误,是因为引用了传递给它的变量,并且在进行类型转换时无法获得引用,除非您首先将该类型转换的变量存储在另一个变量中。之所以这样做,是因为我在之前的评论中已经描述过。令人沮丧的是,这是一个可以接受的答案,因为它可以使人们相信empty()检查数组是否为“空”,这是不正确的,这只是其实际作用的副作用。
蒂莫西·佐恩

它会在php 7+中正常工作,还是修复它的正确方法。
kantsverma

32

编辑:我没有意识到他们想专门检查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

在PHP7.2中不起作用:PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
Juha Untinen

2
@ juha-untinen解决方案->count()专门用于的实例,SimpleXMLElement而不是的实例stdClass。我相信所有这些在PHP7.2中仍然有效。
蒂莫西·佐恩


12

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

这是我在JavaScript中使用的非常简单的解决方案。与提到的将对象强制转换为数组并检查其是否为空或将其编码为JSON的解决方案不同,此简单函数对于处理已用资源来执行简单任务非常有效。

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

    return TRUE;
}

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


8

empty()在对象上使用它时,使用将不会像往常一样工作,因为__isset()如果声明了重载方法,它将被调用。

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

或使用get_object_vars(),例如

get_object_vars($obj) ? TRUE : FALSE;

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 ) );

2

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

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

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

http://it.php.net/manual/zh/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!";
}

1
错误。$ x =新的\ stdClass(); var_dump((bool)$ x); 打印'true'; 在您的情况下,simpleXml在某些情况下可能会返回false
Quamis

正确。new stdClass()是有效的对象,这就是为什么它是真的。PHP手册说,simplexml_load_file(),“返回具有包含XML文档中保存的数据的属性的SimpleXMLElement类的对象,如果失败,则返回FALSE。” 因此,如果您转换(bool)simplexml_load_file(),它将为true(因为该函数返回了一个对象),但是为false(因为该函数返回了false)。
罗斯福

0

如果一个对象是否为“空”是一个定义的问题,并且由于它取决于类表示的对象的性质,则由类来定义。

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

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

// results in bool(false)

“空”对象不能有通用定义。您可能会在上面的示例中争论的结果empty()应为true,因为该对象不代表任何内容。但是PHP如何知道?有些对象从不表示内容(例如,思考工厂),而其他对象始终表示有意义的值(例如思考new DateTime())。

简而言之,您将必须针对特定对象提出自己的条件,并从对象外部或对象中的自写isEmpty()方法对它们进行相应的测试。



-1

我在发布请求中使用了字符串的json_decode。以上都不对我有用,最后我使用了这个:

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

if(json_encode($post_vals->object) != '{}')
{
    // its not empty
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.