【发布时间】: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;} } );