如何检查一个对象在PHP中是空的?
如何find一个对象是否为空或不在PHP中。
以下是$obj
保存XML数据的代码。 我怎样才能检查是否是空的?
我的代码:
$obj = simplexml_load_file($url);
你可以强制转换为一个数组,然后检查它是否为空
$arr = (array)$obj; if (empty($arr)) { // do stuff }
编辑:单行types转换,如下所示,在PHP 5.4中不起作用:
if (empty((array) $obj)) { //do stuff }
编辑 :我没有意识到他们想专门检查一个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认为是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 }
旧答案(简单对象) :
如果你想检查一个简单的对象(typesstdClass
)是否完全是空的(没有键/值),你可以执行以下操作:
// $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
另一个可能的解决scheme,不需要投射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 ) );
你可以把你的对象转换成一个数组,然后像下面这样testing它的计数:
if(count((array)$obj)) { // doStuff }
在对象上使用empty()
将不会像往常一样正常工作,因为如果声明, __isset()
重载方法将被调用。
因此你可以使用count()
(如果对象是可数的 )。
或者通过使用get_object_vars()
,例如
get_object_vars($obj) ? TRUE : FALSE;
这是我在JavaScript中使用的一个非常简单的解决scheme。 与前面提到的将一个对象转换为数组并检查其是否为空或将其编码为JSON的解决scheme不同,此简单函数在使用资源执行简单任务时非常高效。
function emptyObj($obj) { foreach ($obj as $k) { return false; } return true; }
该解决scheme工作在一个非常简单的方式:它不会进入一个foreach循环,如果对象是空的,它将返回true。 如果它不是空的,它将进入foreach循环并立即返回false,而不是通过整个集合。
已经有一个正确的答案,但是再次发布。 我知道PHP是一种肮脏的语言,但奇怪的家伙…想象一下,如果对象不是空的,并在一个相当大的方式,为什么你会浪费资源投它arrays或序列化… …
没有独特的安全方法来检查对象是否为空
php的count()首先转换为数组,但是转换可以产生一个空数组,取决于对象是如何实现的(扩展的对象常常受到这些问题的影响)
在你的情况下,你必须使用$ obj-> count();
http://it.php.net/manual/en/simplexmlelement.count.php
(这不是PHP的计数http://www.php.net/count )
如果你在PHP中使用了一个(bool)types的东西,它会马上告诉你该项是一个对象,原始types还是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!"; }
如果一个对象是“空的”或者不是定义的问题,并且因为它取决于类所代表的对象的性质,那么这个类就是定义的。
PHP本身将类的每个实例视为不为空。
class Test { } $t = new Test(); var_dump(empty($t)); // results in bool(false)
对于“空”对象不能有一个通用的定义。 在上面的例子中,你可能会认为empty()
的结果应该是true
,因为对象不代表任何内容。 但是PHP怎么知道呢? 有些对象从来不是用来表示内容的(例如,想象一下工厂),有些对象总是表示一个有意义的值(想想new DateTime()
)。
总之,你将不得不为自己的标准提出一个特定的对象,并从对象之外或从对象中自写的isEmpty()
方法相应地testing它们。
$array = array_filter($array); if(!empty($array)) { echo "not empty"; }
要么
if(count($array) > 0) { echo 'Error'; } else { echo 'No Error'; }
我在post请求中使用了一个string的json_decode。 以上都没有为我工作,最后我用这个:
$post_vals = json_decode($_POST['stuff']); if(json_encode($post_vals->object) != '{}') { // its not empty }