• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • is_object()

    (PHP 4, PHP 5, PHP 7)

    检测变量是否是一个对象

    描述

    is_object(mixed $var): bool

    如果$var是一个object则返回TRUE,否则返回FALSE

    参见is_bool()、is_int()、is_integer()、is_float()、is_string()和is_array()。

    Note: is_object(null) returns false
    This should actually be part of the input/output specification at the top of this page.
    Unserializes data as returned by the standard PHP serialize() function. If the unserialized object is not an array, it will be converted to one, particularily useful if it returns a __PHP_Incomplete_Class.
    <?php
    /**
     * 
     * @param string $data Serialized data
     * 
     * @return array  Unserialized array
     */
    function unserialize2array($data) {
      $obj = unserialize($data);
      if(is_array($obj)) return $obj;
      $arr = array();
      foreach($obj as $k=>$v) {
        $arr[$k] = $v;
      }
      unset($arr['__PHP_Incomplete_Class_Name']);
      return $arr;
    }
    ?>
    
    Thank you victor AT fourstones DOT net.
    I have written a function to do what victor has suggested, with the ease of use of is_object. It can be used to replace is_object(), but has an extra field [$check], to compare to a certain name. If $check is left empty, it will just check if &$object is an object.
    <?php
    function is_obj( &$object, $check=null, $strict=true )
    {
      if( $check == null && is_object($object) )
      {
        return true;
      }
      if( is_object($object) )
      {
        $object_name = get_class($object);
        if( $strict === true )
        {
          if( $object_name == $check )
          {
            return true;
          }
        }
        else
        {
          if( strtolower($object_name) == strtolower($check) )
          {
            return true;
          }
        }
      }
    }
    ?>
    This could probably be cleaned up, but it's spaced out to be easy to read.
    I'm not even sure how to articulate this, so I'm going to just include test code. Maybe someone else will someday wonder the same thing.
    <?
      error_reporting(E_ALL);
      class testParent
      {
        var $child;
        function testParent()
        {
          $this->child = new testChild();
        }
      }
      class testChild
      {
        function testChild()
        {
        }
      }
      $parent = new testParent();
      $parent2 = 'foobar';
      print join(',', Array(
        is_object($parent) ? 'yes' : 'no',
        is_object($parent->child) ? 'yes' : 'no',
        is_object($parent2) ? 'yes' : 'no',
        is_object($parent2->child) ? 'yes' : 'no'
      ));
    ?>
    This prints "yes,yes,no,no". Basically this shows that you can use is_object to test if the child object is an object without worrying about an error if the parent object isn't an object either.
    You can use is_object($this) to detect if the function is being called via instance or procedure.
    Example:
    <?php
    class mrClass {
      function test( )
      {
        if( is_object($this) )
        {
         // do something for instance method
          echo 'this is an instance call <br />' . "\n";
        }
        else
        {
         // do something different for procedural method
          echo 'this is a procedure call <br />' . "\n";
        }
      }
    }
    $inst = new mrClass();
    $inst->test();
    mrClass::test();
    ?>
    This would output:
    this is an instance call <br />
    this is a procedure call <br />
    :-) Happy coding!
    er, I don't think that's right, especially if calling from another object instance:
    <?
    function test_this()
    {
      $c2 = new C2();
      $c2->func();
      $c1 = new C1();
      $c1->func();
      C1::func();
    }
    class C2
    {
      function func()
      {
        C1::func();
      }
    }
    class C1
    {
      function func()
      {
        if( isset($this) )
        {
          if( strtolower(get_class($this)) != 'c1' )
            print("oops\n");
          else
            print("this is ok\n" );
        }
        else
        {
          print("static call\n");
        }
      }
    }
    test_this();
    ?>
    yields:
    ---------- run-php ----------
    oops
    this is ok
    static call
    Just discovered:
    is_a ( object $object , string $class_name )
    Which checks if the object is of this class or has this class as one of its parents
    Which seems to do what a lot here are trying to replicate
    Cleaning it up even more:
    <?php
    function is_obj(&$object, $className = null, $caseSensitive = true) {
      return is_object($object) && (!is_string($className) || preg_match('/^'.$className.'$/D'.($caseSensitive ? '' : 'i'), get_class($object)));
    }
    ?>
    
    cleaned up peter's code... use only one return statement
    function is_obj( &$object, $check=null, $strict=true )
    {
    $result = false;
     if (is_object($object)) {
       if ($check == null) {
         $result = true;
       } else {
          $object_name = get_class($object);
          $result = ($strict === true)?
            ( $object_name == $check ):
            ( strtolower($object_name) == strtolower($check) );
       }  
     }
    return $result;
    }
    Use instanceof() to check for a specific type.
    Note that closures return true when passed to is_object():
    <?php
    echo
      is_object(
        function(){return "hello";}
      );
    ?>
    Returns true (1)
    here i created one function that i wanted to find but i had never found :X
      function compare_two_object_recursive($object_1, $object_2, $object_1_Identifier = false, $object_2_Identifier = false){
        $object1 = (array)$object_1;
        $object2 = (array)$object_2;
        $object3 = array();
        
        $o1i = $object_1_Identifier ? $object_1_Identifier : 1;
        $o2i = $object_2_Identifier ? $object_2_Identifier : 2;
        
        foreach($object1 as $key => $value){
          if(is_object($object1[$key])){
            $object1[$key] = (array)$object1[$key];
            $object2[$key] = (array)$object2[$key];
            $object3[$key] = (object)compare_two_object_recursive($object1[$key], $object2[$key], $o1i, $o2i);
          }elseif(is_array($object1[$key])){
            $object3[$key] = compare_two_object_recursive($object1[$key], $object2[$key], $o1i, $o2i);
          }else{
            if($object1[$key] == $object2[$key]){
              $object3[$key]['comparison_status'] = "SAME";
            }else{
              $object3[$key]['comparison_status'] = "NOT THE SAME";
              $object3[$key][$o1i] = $object1[$key];
              $object3[$key][$o2i] = $object2[$key];
            }
          }
        }
        return $object3;
      }

    上篇:is_numeric()

    下篇:is_real()