2013-04-03 8 views
5

Mam klasę z publicznymi, publicznymi statycznymi, prywatnymi i prywatnymi właściwościami statycznymi i próbuję uzyskać tylko te publiczne. Po prostu nie mogę uzyskać prawo filtra z jakiegoś powodu, próbowałemWłaściwości odbijania Filtr

ReflectionProperty::IS_PUBLIC & ~ReflectionProperty::IS_STATIC 

lub

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

między innymi, ale albo ciśgle statyczne publicznej i prywatnej te statyczne.

+0

Bardzo dobry punkt. Ponadto, 'ReflectionProperty :: IS_PUBLIC | ReflectionProperty :: IS_STATIC' daje również _all_ public i _all_ właściwości statyczne, więc kombinację, a nie przecięcie. Nie to, czego oczekiwałbym od takiej funkcji. wygląda na to, że zwrócone ReflectionProperties wydaje się być jedynym sposobem na zrobienie tego. – Wrikken

Odpowiedz

3

Trzeba by zbadać wszystkie publics a następnie filtrować statykę publicznych się tak:

$ro = new ReflectionObject($obj); 

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

mój prawdziwy problem dotyczył bitu filtru, ponieważ celowałem w najbardziej elegancki kod, ale twoje rozwiązanie jest lepsze niż moje (użył scalania dwóch tablic). Dzięki – francis

+0

Kolejne "jeśli" w kodzie ... –

+0

@PeterM Co przez to rozumiesz? –

1

uzyskać wszystkie publics i wszystkie statyka następnie dostać przecinają go:

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

Powroty:

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

Wydaje mi się, że pomysł polegał na tym, by publiczność straciła publiczną statystykę. –

+0

oops. tak powinno być użycie 'array_diff'. – Alireza41

+0

To powinno zadziałać, chociaż nazywasz 'getProperties()' jeden raz za dużo ;-) –