2013-04-03 22 views
5

Ho una classe con proprietà statiche pubbliche, pubbliche, private e private e sto cercando di ottenere solo quelle pubbliche. Non riesco a ottenere il giusto filtro per qualche motivo, ho provatoProprietà di riflessione Filtro

ReflectionProperty::IS_PUBLIC & ~ReflectionProperty::IS_STATIC 

o

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

tra le altre cose, ma io continuo a ricevere sia il pubblico statico o quelli statici privati.

+0

Ottimo punto. Inoltre, 'ReflectionProperty :: IS_PUBLIC | ReflectionProperty :: IS_STATIC' fornisce anche _all_ public e _all_ proprietà statiche, quindi una combinazione, non l'intersezione. Non è quello che mi aspetterei da una funzione come questa. sembra che esaminando il riflesso ReflectionProperties sembra l'unico modo per farlo. – Wrikken

risposta

3

Si avrebbe bisogno di interrogare tutti i pubblici e poi filtrare la statica pubblici come questo:

$ro = new ReflectionObject($obj); 

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

il mio vero problema era con i bit di filtro poiché stavo puntando al codice più elegante, ma la tua soluzione è in realtà migliore della mia (usato due allineamenti di array). Grazie – francis

+0

Quindi un altro 'if' nel codice ... –

+0

@PeterM Cosa intendi con questo? –

1

ottenere tutti i pubblici e tutti i statica quindi ottenere intersecano di esso:

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

rendimenti:

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

Penso che l'idea fosse di far sì che il pubblico non avesse la statica pubblica. –

+0

oops. quindi dovrebbe essere usato 'array_diff'. – Alireza41

+0

Che dovrebbe funzionare, anche se stai chiamando 'getProperties()' una volta di troppo ;-) –

Problemi correlati