2012-03-28 15 views

Respuesta

9

He trabajado esta prueba rápida. Parece que las propiedades privadas de los padres están ocultas cuando obtiene las propiedades de las clases secundarias. Sin embargo, si invoca getParentClass() y luego getProperties(), tendrá el conjunto faltante de accesorios privados.

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

salida (nótese la hélice privada Ford::model falta):

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

Segunda Chunk (contiene todas las propiedades de la clase 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! ¡Gracias! Me pregunto si puede hacer $ class-> getParentClass() -> getProperty ('model') -> setValue ($ car, 'F-150') – johnnietheblack

0

Creo que usted ganó' t obtener las propiedades privadas primarias porque la clase secundaria no puede acceder a ellas

2

Aunque succ Inct, la respuesta aceptada desatiende la posibilidad de una clase infantil con muchos ancestros. Este es el método de instancia que utilizo para lograrlo:

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

Atraviesa la jerarquía hasta que llegue a la clase raíz, mientras que la fusión de las propiedades de cada uno de los padres con las propiedades de sus hijos (y en el caso de incumplimientos , usa solo los valores predeterminados encontrados en la parte más baja de la jerarquía).

Cuestiones relacionadas