2017-06-12 69 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" 
    } 
]