2012-03-28 31 views

Trả lời

9

Tôi đã làm bài kiểm tra nhanh này. Có vẻ như các thuộc tính riêng của cha mẹ bị ẩn khi bạn nhận được các thuộc tính của lớp con. Tuy nhiên, nếu bạn gọi getParentClass() thì getProperties() bạn sẽ có bộ đạo cụ riêng tư bị thiếu.

<?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 (chú ý prop tin Ford::model là mất tích):

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

Second Chunk (chứa tất cả các thuộc tính của lớp 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! Cảm ơn! Tôi tự hỏi nếu bạn có thể làm $ class-> getParentClass() -> getProperty ('model') -> setValue ($ car, 'F-150') – johnnietheblack

0

Tôi nghĩ rằng bạn thắng' t có được các thuộc tính riêng tư của cha mẹ bởi vì lớp con không thể truy cập chúng

2

Mặc dù succ không, câu trả lời được chấp nhận bỏ qua khả năng của một lớp trẻ với nhiều tổ tiên. Đây là phương pháp dụ tôi sử dụng để đạt được điều này:

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

Nó đi qua lên thứ bậc cho đến khi nó đạt đến lớp gốc, trong khi việc sáp nhập các thuộc tính của mỗi phụ huynh với các thuộc tính của con của nó (và trong trường hợp giá trị mặc định , chỉ sử dụng các giá trị mặc định được tìm thấy ở phần dưới cùng của cấu trúc phân cấp).

Các vấn đề liên quan