2012-03-23 22 views
5

Tôi muốn có một tài sản riêng trong một lớp học, và có thể thiết lập nó với một lớp khác, thông qua một ReflectionClass.Liệu ReflectionProperty :: setAccessible có thể truy cập tài sản vĩnh viễn không?

Tôi biết rằng nếu tôi tạo ReflectionProperties thuộc tính của lớp, tôi có thể đặt chúng thành có thể truy cập và sau đó đặt giá trị của chúng.

Tuy nhiên, nếu tôi đặt thuộc tính có thể truy cập, nó có thể truy cập được ở mọi nơi (như thuộc tính công khai) hay chỉ trong ngữ cảnh của ReflectionProperty?

+1

bạn đang cố gắng đạt được điều gì? Nếu bạn có một tài sản riêng tư, bạn cần phải đặt ở nơi khác, tại sao không chỉ cung cấp một setter công cộng cho nó? – liquorvicar

+0

Điều này có thể hữu ích khi viết các bài kiểm tra .. – Weston

+0

@liquorvicar Nó không phải là một tài sản riêng điển hình - nó phải được đặt bởi một điều, ở một nơi nào đó, và nó có thể xảy ra sau khi xây dựng. Lời bình luận của Weston cũng được áp dụng. – johnnietheblack

Trả lời

9

Chỉ có thể truy cập thông qua ReflectionProperty::getValue()ReflectionProperty::setValue(), vì vậy lớp gốc và tất cả các phiên bản của nó sẽ không thay đổi mức hiển thị.

Ví dụ:

<?php 

    class MyClass { 
     public function __construct() { $this->priv = 42; } 
     private $priv; 
    } 

    $a = new MyClass(); 

    $ref = new ReflectionClass("MyClass"); 

    $prop = $ref->getProperty("priv"); 
    $prop->setAccessible(TRUE); 

    echo "priv: " . $prop->getValue($a) . "\n"; // OK! 

    echo $a->priv;        // <-- error 
    ?> 
Các vấn đề liên quan