【问题标题】:How to check that an object is empty in PHP?如何在 PHP 中检查对象是否为空?
【发布时间】:2012-03-13 19:17:30
【问题描述】:

如何在 PHP 中判断一个对象是否为空。

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

我的代码:

$obj = simplexml_load_file($url);

【问题讨论】:

标签: php object


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在 PHP 版本 8 中

    考虑您要访问对象的属性,但您不确定对象本身是否为空,并且可能导致错误。在这种情况下,您可以使用 php 8 中引入的 Nullsafe operator,如下所示:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 类型转换对我不起作用,因为我收到错误:PHP Parse error: syntax error, unexpected '(array)' (array) (T_ARRAY_CAST) in ... 我使用 PHP 版本 5.4.28,第一个选项有两行代码对我有用。
      • 上传 WordPress 插件时出现同样的错误,似乎他们也使用了旧版本的 PHP。
      • empty 实际上并不检查数组是否为空,empty($var) 相当于(!isset($var) || !$var)。你可以用!$arr替换你的empty($arr)s,因为array() == FALSE
      • empty((array) $obj) 在 PHP 5.4+ 中不起作用的原因与一行的类型转换无关。您收到错误是因为empty() 引用了传递给它的变量,并且在类型转换时它无法获得引用,除非您首先将该类型转换的变量存储在另一个变量中。这样做是因为我在之前的评论中所描述的。令人沮丧的是,这是公认的答案,因为它可以让人们相信 empty() 检查数组是否为“空”,这是不正确的 - 这只是它实际作用的副作用。
      • 它将在 php 7+ 中工作,或者它是修复它的正确方法。
      【解决方案4】:

      想象一下,如果对象不是空的并且相当大,你为什么要浪费资源将它转换为数组或序列化它......

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

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

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

      【讨论】:

        【解决方案5】:

        你可以将你的对象转换成一个数组,并像这样测试它的计数:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 在 PHP7.2 中不起作用:PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
          • @juha-untinen ->count() 的解决方案专门针对SimpleXMLElement 的实例,而不是stdClass 的实例。我相信所有这些在 PHP7.2 中仍然有效。
          【解决方案7】:
          $array = array_filter($array);
          if(!empty($array)) {
              echo "not empty";
          }
          

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

          【讨论】:

          • 虽然这可能会回答这个问题,但在您的答案中加入一些文字来解释您在做什么总是一个好主意。阅读how to write a good answer
          【解决方案8】:

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

          【讨论】:

          • 错误。 $x = 新 \stdClass(); var_dump((bool)$x);打印“真”;在您的情况下,simpleXml 在某些情况下可能会返回 false
          • 正确。 new stdClass() 是一个有效的对象,这就是为什么它是真的。 PHP 手册说,simplexml_load_file(),“返回 SimpleXMLElement 类的对象,其属性包含 XML 文档中保存的数据,否则返回 FALSE 失败。”所以,如果你强制转换 (bool)simplexml_load_file(),它将为 true(因为函数返回一个对象)但为 false(因为函数返回 false)。
          【解决方案9】:

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

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

          或者使用get_object_vars(),例如

          get_object_vars($obj) ? TRUE : FALSE;
          

          【讨论】:

            【解决方案10】:

            我在 post 请求中使用了字符串的 json_decode。以上都不适合我,最后我用了这个:

            $post_vals = json_decode($_POST['stuff']);
            
            if(json_encode($post_vals->object) != '{}')
            {
                // its not empty
            }
            

            【讨论】:

              【解决方案11】:

              另一个不需要转换为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 ) );
              

              【讨论】:

                【解决方案12】:

                一个对象是否“空”是定义的问题,因为这取决于类所代表的对象的性质,所以由类来定义。

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

                class Test { }
                $t = new Test();
                var_dump(empty($t));
                
                // results in bool(false)
                

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

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

                【讨论】:

                  【解决方案13】:

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

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

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

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

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

                  【讨论】:

                    猜你喜欢
                    • 2010-11-26
                    • 1970-01-01
                    • 2013-10-11
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-06-09
                    • 2013-02-13
                    • 1970-01-01
                    相关资源
                    最近更新 更多