2013-04-03 115 views
5

我有一个具有公共,公共静态,私有和私有静态属性的类,并且我试图仅获取公有的属性。我只是不能出于某种原因,过滤器的权利,我想反射属性筛选器

ReflectionProperty::IS_PUBLIC & ~ReflectionProperty::IS_STATIC 

ReflectionProperty::IS_PUBLIC & (ReflectionProperty::IS_PUBLIC | ~ReflectionProperty::IS_STATIC) 

除其他事情,但无论是我不断收到静态公共或私人静态的。

+0

非常好的一点。另外,'ReflectionProperty :: IS_PUBLIC | ReflectionProperty :: IS_STATIC'还提供了_all_ public和_all_静态属性,所以是一个组合,而不是交集。不是我所期望的这样的功能。似乎检查返回的ReflectionProperties似乎是唯一的方法来做到这一点。 – Wrikken

回答

3

您需要查询所有公众,然后过滤公共静出这样的:

$ro = new ReflectionObject($obj); 

$publics = array_filter(
    $ro->getProperties(ReflectionProperty::IS_PUBLIC), 
    function(ReflectionProperty $prop) { 
     return !$prop->isStatic(); 
    } 
); 
+0

我的真正的问题是过滤器位,因为我的目标是最优雅的代码,但你的解决方案实际上比我的更好使用两个数组合并)。谢谢 – francis

+0

所以在代码中另一个'if'... – 2014-12-10 12:42:54

+0

@PeterM你是什么意思? –

1

让所有公众,然后将所有静态得到相交的那样:

class Test{ 
public static $test1 = 'test1'; 
private static $test2 = 'test2'; 
public $test3 = 'test3'; 
} 
$test = new Test(); 
$ro = new ReflectionObject($test); 
$publics = $ro->getProperties(ReflectionProperty::IS_PUBLIC); 
$statics = $ro->getProperties(ReflectionProperty::IS_STATIC); 
var_export(array_diff($publics, $statics)); 

回报:

array (1 => ReflectionProperty::__set_state(array('name' => 'test3', 'class' => 'Test',)),) 
+0

我认为这个想法是让公众了解公共静态。 –

+0

oops。所以应该使用'array_diff'。 – Alireza41

+0

这应该可以,尽管你打电话给'getProperties()'一次太多了;-) –