2012-03-28 11 views

Odpowiedz

9

Opracowałem ten szybki test. Wygląda na to, że prywatne właściwości rodzica są ukrywane, gdy uzyskasz właściwości klas potomnych. Jeśli jednak wywołasz getParentClass(), a następnie getProperties(), otrzymasz brakujący zestaw prywatnych rekwizytów.

<?php 
class Ford { 
    private $model; 
    protected $foo; 
    public $bar; 
} 

class Car extends Ford { 
    private $year; 
} 

$class = new ReflectionClass('Car'); 
var_dump($class->getProperties()); // First chunk of output 
var_dump($class->getParentClass()->getProperties()); // Second chunk 

Output (zauważ prywatny prop Ford::model brakuje):

array(3) { 
    [0]=> 
    &object(ReflectionProperty)#2 (2) { 
    ["name"]=> 
    string(4) "year" 
    ["class"]=> 
    string(3) "Car" 
    } 
    [1]=> 
    &object(ReflectionProperty)#3 (2) { 
    ["name"]=> 
    string(3) "foo" 
    ["class"]=> 
    string(4) "Ford" 
    } 
    [2]=> 
    &object(ReflectionProperty)#4 (2) { 
    ["name"]=> 
    string(3) "bar" 
    ["class"]=> 
    string(4) "Ford" 
    } 
} 

drugie Chunk (zawiera wszystkie właściwości klasy Ford):

array(3) { 
    [0]=> 
    &object(ReflectionProperty)#3 (2) { 
    ["name"]=> 
    string(5) "model" 
    ["class"]=> 
    string(4) "Ford" 
    } 
    [1]=> 
    &object(ReflectionProperty)#2 (2) { 
    ["name"]=> 
    string(3) "foo" 
    ["class"]=> 
    string(4) "Ford" 
    } 
    [2]=> 
    &object(ReflectionProperty)#5 (2) { 
    ["name"]=> 
    string(3) "bar" 
    ["class"]=> 
    string(4) "Ford" 
    } 
} 
+0

Gnarly! Dzięki! Zastanawiam się, czy możesz wtedy zrobić $ class-> getParentClass() -> getProperty ('model') -> setValue ($ car, 'F-150') – johnnietheblack

0

Myślę, że wygrał” t uzyskać macierzyste właściwości prywatne, ponieważ klasa podrzędna nie może uzyskać do nich dostępu

2

Chociaż succ inct, przyjęta odpowiedź zaniedbuje możliwość zajęcia dziecka z wieloma przodkami. Jest to metoda przykład użyć do osiągnięcia tego celu:

public function getProperties() { 
    $properties = array(); 
    try { 
     $rc = new \ReflectionClass($this); 
     do { 
      $rp = array(); 
      /* @var $p \ReflectionProperty */ 
      foreach ($rc->getProperties() as $p) { 
       $p->setAccessible(true); 
       $rp[$p->getName()] = $p->getValue($this); 
      } 
      $properties = array_merge($rp, $properties); 
     } while ($rc = $rc->getParentClass()); 
    } catch (\ReflectionException $e) { } 
    return $properties; 
} 

przechodzenia w górę hierarchii, aż osiągnie klasy główny, podczas gdy połączenie właściwości każdego z rodziców, z właściwościami swoich dzieci (w odniesieniu do wartości domyślnych , używa tylko wartości domyślnych znalezionych w najniższej części hierarchii).

Powiązane problemy