2013-04-03 5 views
5

私はpublic、public static、privateとprivateの静的なプロパティを持つクラスを持っています。私はpublicなものだけを取得しようとしています。私はいくつかの理由のためのフィルタ権を得ることができない、私は他のものの間リフレクションのプロパティフィルタ

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

私の本当の問題は、最もエレガントなコードを目指していたので、フィルタービットであったのですが、あなたの解決策は実際には私のものより優れています2つの配列マージを使用した)。ありがとう – francis

+0

コード内の別の 'if' ... –

+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()'を一度も呼びたくても;-) –

関連する問題