Note: is_object(null) returns false
This should actually be part of the input/output specification at the top of this page.
(PHP 4, PHP 5, PHP 7, PHP 8)
is_object — 查找变量是否是对象
value
要计算的变量。
如果 value
是 object,返回
true
,否则返回 false
。
版本 | 说明 |
---|---|
7.2.0 |
没有定义类(__PHP_Incomplete_Class 类)的未序列化对象,is_object()
现在返回 true ,之前返回 false 。
|
示例 #1 is_object() 示例
<?php
// 声明简单的函数,从对象中返回数组
function get_students($obj)
{
if (!is_object($obj)) {
return false;
}
return $obj->students;
}
// 声明新的类实例并填充值
$obj = new stdClass();
$obj->students = array('Kalle', 'Ross', 'Felipe');
var_dump(get_students(null));
var_dump(get_students($obj));
?>
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;
}
?>
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!
Note that closures return true when passed to is_object():
<?php
echo
is_object(
function(){return "hello";}
);
?>
Returns true (1)
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.
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
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
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)));
}
?>
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;
}
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;
}