使用 PHP 反射获取非静态的公共属性

Dlk*_*Dlk 3 php api class object

我需要使用PHP 反射 API来获取非 static类的所有可公开访问的属性。

为了只获取非静态的公共属性,我能看到的唯一方法是获取 IS_STATIC 属性并用于array_diff()仅获取公共属性。

最后的课程是这样的:

class foo {
    public static $a;
    public static $b;
    public static $c;

    public $d;
    public $e;
    public $f;

    public function reflect()
    {
        $reflection = new ReflectionClass($this);
        $public = $reflection->getProperties(ReflectionProperty::IS_PUBLIC);
        $static = $reflection->getProperties(ReflectionProperty::IS_STATIC);
        $properties = array_diff($public, $static);
        foreach($properties as $property) {
            echo $property->name . "n";
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

称呼:

$foo = new foo;
$foo->reflect();
Run Code Online (Sandbox Code Playgroud)

reflect()现在的输出如下所示:

d
e
f
Run Code Online (Sandbox Code Playgroud)

问题:有没有更好的方法来做到这一点?

注意:我原来的班级太长了!这个类是一个类似于我的例子。

u_m*_*der 7

最快的方法肯定是 use get_object_vars,对于您的情况:

print_r(get_object_vars($foo)); 
// outputs
Array
(
    [d] => 
    [e] => 
    [f] => 
)
Run Code Online (Sandbox Code Playgroud)

键是属性的名称。

但是实例化一个实例可能非常繁重。所以,你仍然可以使用反射和一些过滤:

public function reflect()
{
    $reflection = new ReflectionClass($this);
    $properties =  array_filter(
        $reflection->getProperties(ReflectionProperty::IS_PUBLIC),
        function ($property) {
            return !$property->isStatic();
        }
    );
    foreach($properties as $property) {
        echo $property->name . "\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 至少因为你不必使用“array_diff”。 (2认同)