2013-04-03 15 views
5

Genel, genel statik, özel ve özel statik özelliklere sahip bir sınıfım var ve yalnızca halka açık olanları almaya çalışıyorum. Sadece nedense filtre hakkını alamayan, ben başka şeylerin yanı sıraYansıma özellikleri Süzgeç

ReflectionProperty::IS_PUBLIC & ~ReflectionProperty::IS_STATIC 

veya

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

çalıştı ama ya ben statik kamu veya özel statik olanları alıyorum.

+0

Çok iyi nokta. Ayrıca, ReflectionProperty :: IS_PUBLIC | ReflectionProperty :: IS_STATIC' ayrıca hemallik hem de _all_ statik özellikleri, yani birleşim, kavşak değil, hem verir. Böyle bir işlevden beklentim olmazdı. döndürülen ReflectionProperties incelemek için bunu yapmanın tek yolu hakkında görünüyor. – Wrikken

cevap

3

Böyle kamusal statiği filtre sonra tüm kitleleri sorgulamak ve gerekir:

$ro = new ReflectionObject($obj); 

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

aradım çünkü en zarif kodu hedeflediğimden beri benim gerçek sorun filtre bitleriyle ilgiliydi, ama çözümün benimkinden daha iyi. iki dizi birleştirir kullanılır. Teşekkürler – francis

+0

Yani başka bir 'if' kod içinde ... –

+0

@PeterM Bununla ne demek istiyorsun? –

1

tüm kitleleri almak ve tüm statik o zaman kesişme olsun:

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)); 

döner:

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

Sanırım fikir halkı kamusal statiğe sokmaktı. –

+0

oops. Yani 'array_diff' kullanılmalıdır. – Alireza41

+0

Bu işe yarayacak olsa da, getProperties() 'i bir kerede çok fazla ;-) –