探究get_object_vars

发布时间:2023-05-19

一、概述

get_object_vars 是 PHP 内置函数,可以获取对象的所有属性,返回一个由属性名和属性值组成的关联数组。

class Foo {
    private $privateProperty = 'private';
    protected $protectedProperty = 'protected';
    public $publicProperty = 'public';
}
$foo = new Foo();
$vars = get_object_vars($foo);
print_r($vars);

输出结果为:

Array
(
    [protectedProperty] => protected
    [publicProperty] => public
)

可以看到,私有属性 $privateProperty 并未被返回。

二、只返回某些属性

如果只需要获取对象的某些属性,可以结合 array_intersect_key 函数使用,快速筛选。示例代码如下:

class Bar {
    public $foo = 'foo';
    public $bar = 'bar';
    public $baz = 'baz';
}
$bar = new Bar();
$vars = get_object_vars($bar);
$vars = array_intersect_key($vars, array_flip(['foo', 'baz']));
print_r($vars);

输出结果为:

Array
(
    [foo] => foo
    [baz] => baz
)

三、数组遍历

get_object_vars 返回的是一个关联数组,可以使用 foreach 语句进行遍历。示例代码如下:

class Baz {
    public $foo = 'foo';
    public $bar = 'bar';
    public $baz = 'baz';
}
$baz = new Baz();
$vars = get_object_vars($baz);
foreach ($vars as $key => $value) {
    echo "$key: $value\n";
}

输出结果为:

foo: foo
bar: bar
baz: baz

四、获取静态属性

虽然 get_object_vars 的名字中含有 "object",但它也可以用来获取类的静态属性。示例代码如下:

class Quux {
    public static $foo = 'foo';
    public static $bar = 'bar';
    public static $baz = 'baz';
}
$vars = get_object_vars('Quux');
print_r($vars);

输出结果为:

Array
(
    [foo] => foo
    [bar] => bar
    [baz] => baz
)

五、获取对象方法

get_object_vars 不能获取对象的方法,但是可以借助 ReflectionClass 类获取。示例代码如下:

class Quux {
    public function foo() {
        return 'foo';
    }
    public function bar() {
        return 'bar';
    }
    public function baz() {
        return 'baz';
    }
}
$quux = new Quux();
$methods = [];
$reflection = new ReflectionClass($quux);
foreach($reflection->getMethods() as $method) {
    if ($method->class == get_class($quux)) {
        $methods[] = $method->name;
    }
}
print_r($methods);

输出结果为:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)

六、总结

get_object_vars 是一个非常有用的函数,通过它我们可以快速获取对象的属性,并对属性进行筛选、遍历等操作。同时,我们还可以借助相关的技术手段,获取类的静态属性和对象的方法。