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

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

下面是 $obj保存 XML 数据的代码。我如何检查它是否为空?

我的代码:

$obj = simplexml_load_file($url);
211913 次浏览

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

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

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

php's count() first casts to array, but casting can produce an empty array, depends by how the object is implemented (extensions' objects are often affected by those issues)

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

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

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

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

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

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


// results in bool(false)

“空”对象不能有泛型定义。在上面的例子中,您可能认为 empty()的结果应该是 true,因为该对象不表示任何内容。但是 PHP 怎么知道呢?有些对象永远不会表示内容(比如说工厂) ,而有些对象总是表示一个有意义的值(比如说 new DateTime())。

In short, you will have to come up with your own criteria for a specific object, and test them accordingly, either from outside the object or from a self-written isEmpty() method in the object.

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

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

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

如果您在 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!";
}

我在 post request 中使用了字符串的 json _ decode。以上这些对我都不管用,最后我用了这个:

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


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

想象一下,如果对象不是空的,并且在某种程度上非常大,那么为什么要浪费资源将其强制转换为数组或序列化..。

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

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


return TRUE;
}

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

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

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

或使用 get_object_vars()

get_object_vars($obj) ? TRUE : FALSE;

编辑 : 我没有意识到他们想要特别检查 SimpleXMLElement 对象是否为空。我在下面留下了旧的答案

Updated Answer (SimpleXMLElement):

For 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
}

如果 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
}


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
{
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 = array_filter($array);
if(!empty($array)) {
echo "not empty";
}

或者

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

在 PHP 版本8

假设您想访问一个对象的属性,但是您不确定该对象本身是否为 null,这可能会导致错误。在这种情况下,你可以使用在 php 8中引入的 Nullsafe operator如下:

$country = $session?->user?->getAddress()?->country;

只需检查对象类型是否为 null。

if( $obj !== null )
{
// DO YOUR WORK
}

基于 kenorb 的 这个答案,下面是另一个针对具有 公众人士变量的对象的一行程序:

if (!empty(get_object_vars($myObj))) { ... }

对于具有私有或受保护变量的对象,最好像其他人提到的那样强制转换为数组。

count($the_object) > 0 this is working and can be use for array too