【发布时间】:2012-03-13 19:17:30
【问题描述】:
如何在 PHP 中判断一个对象是否为空。
以下是$obj 保存XML 数据的代码。如何检查它是否为空?
我的代码:
$obj = simplexml_load_file($url);
【问题讨论】:
如何在 PHP 中判断一个对象是否为空。
以下是$obj 保存XML 数据的代码。如何检查它是否为空?
我的代码:
$obj = simplexml_load_file($url);
【问题讨论】:
只需检查对象类型是否为空。
if( $obj !== null )
{
// DO YOUR WORK
}
【讨论】:
在 PHP 版本 8 中
考虑您要访问对象的属性,但您不确定对象本身是否为空,并且可能导致错误。在这种情况下,您可以使用 php 8 中引入的 Nullsafe operator,如下所示:
$country = $session?->user?->getAddress()?->country;
【讨论】:
您可以强制转换为一个数组,然后检查它是否为空
$arr = (array)$obj;
if (!$arr) {
// do stuff
}
【讨论】:
empty($var) 相当于(!isset($var) || !$var)。你可以用!$arr替换你的empty($arr)s,因为array() == FALSE
empty((array) $obj) 在 PHP 5.4+ 中不起作用的原因与一行的类型转换无关。您收到错误是因为empty() 引用了传递给它的变量,并且在类型转换时它无法获得引用,除非您首先将该类型转换的变量存储在另一个变量中。这样做是因为我在之前的评论中所描述的。令人沮丧的是,这是公认的答案,因为它可以让人们相信 empty() 检查数组是否为“空”,这是不正确的 - 这只是它实际作用的副作用。
想象一下,如果对象不是空的并且相当大,你为什么要浪费资源将它转换为数组或序列化它......
这是我在 JavaScript 中使用的一个非常简单的解决方案。与前面提到的将对象转换为数组并检查它是否为空或将其编码为 JSON 的解决方案不同,这个简单的函数对于执行简单任务所使用的资源非常有效。
function emptyObj( $obj ) {
foreach ( $obj AS $prop ) {
return FALSE;
}
return TRUE;
}
解决方案的工作方式非常简单:如果对象为空,它根本不会进入 foreach 循环,而是返回true。如果它不为空,它将进入foreach循环并立即返回false,而不是通过整个集合。
【讨论】:
你可以将你的对象转换成一个数组,并像这样测试它的计数:
if(count((array)$obj)) {
// doStuff
}
【讨论】:
编辑:我没有意识到他们想专门检查 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
【讨论】:
PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
->count() 的解决方案专门针对SimpleXMLElement 的实例,而不是stdClass 的实例。我相信所有这些在 PHP7.2 中仍然有效。
$array = array_filter($array);
if(!empty($array)) {
echo "not empty";
}
或
if(count($array) > 0) {
echo 'Error';
} else {
echo 'No Error';
}
【讨论】:
如果您在 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!";
}
【讨论】:
在对象上使用empty() 时将无法正常工作,因为如果声明了__isset(),则将改为调用重载方法。
因此你可以使用count()(如果对象是Countable)。
或者使用get_object_vars(),例如
get_object_vars($obj) ? TRUE : FALSE;
【讨论】:
我在 post 请求中使用了字符串的 json_decode。以上都不适合我,最后我用了这个:
$post_vals = json_decode($_POST['stuff']);
if(json_encode($post_vals->object) != '{}')
{
// its not empty
}
【讨论】:
另一个不需要转换为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 ) );
【讨论】:
一个对象是否“空”是定义的问题,因为这取决于类所代表的对象的性质,所以由类来定义。
PHP 本身认为类的每个实例都不为空。
class Test { }
$t = new Test();
var_dump(empty($t));
// results in bool(false)
“空”对象不能有通用定义。您可能会争辩在上面的示例中empty() 的结果应该是true,因为该对象不代表任何内容。但是 PHP 怎么知道呢?有些对象永远不会代表内容(例如工厂),有些对象总是代表一个有意义的值(想想new DateTime())。
简而言之,您必须为特定对象提出自己的标准,并相应地测试它们,无论是从对象外部还是从对象中自己编写的isEmpty() 方法。
【讨论】:
没有唯一安全的方法来检查对象是否为空
php 的 count() 首先转换为数组,但是转换可以产生一个空数组,这取决于对象是如何实现的(扩展的对象经常受到这些问题的影响)
在你的情况下,你必须使用 $obj->count();
http://it.php.net/manual/en/simplexmlelement.count.php
(这不是php的计数http://www.php.net/count)
【讨论】: