2017-06-12 67 views
1

我有一个类:只得到扩展分类变量

class Person { 
    public $id; 
    public $firstName; 
    public $lastName 
} 

,另一种是将其扩展:

class Student extends Person { 
    public $grade; 
} 

的问题是,当我在扩展学生类中使用get_object_vars(),我Person也收到$id,$firstName$lastName。 我如何获得ONLY$grade from Student?

我试图使变量亲自为“受保护”,但我却无法使用get_object_vars()

+0

什么是你想用这个来完成? – gvlasov

+0

@gvlasov我们有我们的DB类构建CRUD查询,对象变量是数据库中的列。学生在数据库的单独表格中有更多的属性。 –

回答

1

好让他们,你可能需要一个额外的方法和Reflection类来获得你想要的结果。

这是你的Person类不变:

class Person { 
    public $id; 
    public $firstName; 
    public $lastName; 
} 

而且Student类附加props()方法:

class Student extends Person { 
    public $grade, $age; 

    function props(){ 
    $class = new ReflectionClass($this); 
    $class = $class->getParentClass(); 
    $props = $class->getProperties(); 

    $original = array_map(function($e){ 
     return $e->name; 
    }, $props); 

    $original = array_flip($original); 

    return array_diff(array_keys(get_class_vars(__CLASS__)), array_keys($original)); 
    } 
} 

现在props()方法将只包含在子类中声明的属性。

var_export((new Student)->props()); // array (0 => 'grade', 1 => 'age',) 
0

使用修改ReflectionClass::getProperties

$studentReflectionClass = new ReflectionClass('Student'); 
$studentProperties = array_filter(
    $studentReflectionClass->getProperties(), 
    function ($properties) use ($studentReflectionClass) { 
     return $properties->getDeclaringClass()->getName() === $studentReflectionClass->getName(); 
    } 
); 

dump($studentProperties); 

输出:

array:1 [      
    0 => ReflectionProperty {#4 
     +name: "grade" 
     +class: "Student" 
     modifiers: "public" 
    } 
]