2012-03-28 15 views

risposta

9

Ho elaborato questo test rapido. Sembra che le proprietà private del genitore siano nascoste quando si ottengono le proprietà delle classi figlie. Tuttavia, se invochi getParentClass() quindi getProperties(), avrai il set mancante di oggetti di scena privati.

<?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 

di uscita (si noti l'elica privato Ford::model manca):

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" 
    } 
} 

Seconda Chunk (contiene tutte le proprietà della classe 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! Grazie! Mi chiedo se è quindi possibile fare $ class-> getParentClass() -> getProperty ('model') -> setValue ($ car, 'F-150') – johnnietheblack

0

Penso che hai vinto' t ottenere le proprietà private parent perché la classe figlio non può accedervi

2

Sebbene succ inct, la risposta accettata trascura la possibilità di una classe di bambino con molti antenati. Questo è il metodo di istanza che uso per raggiungere questo obiettivo:

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

Si attraversa la gerarchia fino a raggiungere la classe radice, mentre la fusione le proprietà di ciascun genitore con le proprietà dei suoi figli (e, nel caso di inadempienze , usa solo i valori di default che si trovano nella parte più bassa della gerarchia).

Problemi correlati