【问题标题】:Get public properties that aren’t static with PHP Reflection使用 PHP 反射获取非静态的公共属性
【发布时间】:2026-02-22 00:35:01
【问题描述】:

我需要使用PHP Reflection API 来获取非静态类的所有可公开访问的属性。

为了仅获取非静态的公共属性,我能想到的唯一方法是获取 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";
        }
    }

}

呼叫:

$foo = new foo;
$foo->reflect();

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

d
e
f

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

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

【问题讨论】:

  • 反射用于其他用途,我认为您应该在真实对象上使用get_object_vars (object $object )php.net/manual/fr/function.get-object-vars.php`
  • 你的意思是php.net/manual/en/reflection.examples.php如何获得非静态?
  • 获取所有公共道具并申请array_filter!->isStatic
  • 在这种情况下,您不需要使用反射,$a = new Foo(); var_dump(\get_object_vars($a)); 效果很好,您将获得对象的所有公共属性和非静态属性。
  • 正如@u_mulder 所说,您可以过滤:\array_filter($public, function ($i) {if (false === $i->isStatic()) {return $i;} } );

标签: php api class object


【解决方案1】:

对于你的情况,最快的方法肯定是使用get_object_vars

print_r(get_object_vars($foo)); 
// outputs
Array
(
    [d] => 
    [e] => 
    [f] => 
)

键是属性的名称。

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

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";
    }
}

【讨论】:

  • 您能解释一下为什么它比我的解决方案更好吗?
  • 至少因为你不必使用array_diff
  • 该死!我需要再次查看array_filter()array_diff(),记性不好:) 我现在试一试,看看有什么不同。谢谢
  • 好的!在我的主类中有一些重复的键,所以我必须使用两个函数array_diff() 来查找重复项,然后使用array_filter() 来获取非静态,我不确定性能,但它可以满足它的要求。非常感谢。