2012-07-14 23 views
6

Ví dụ:Tiếp cận lớp tài sản máng liên tục không hoạt động

class LOL{ 
    const 
    FOO = 1; 
} 

$x = new LOL; 
$arr = array('x' => $x); 

echo $x::FOO; // works 
echo $arr['x']::FOO; // works too 

Nhưng nếu tôi làm ví dụ lớp học của tôi một tài sản, tôi không thể truy cập liên tục nữa:

class WWW{ 
    protected $lol; 

    public function __construct($lol){ 
    $this->lol= $lol;  
    } 

    public function doSMth(){ 
    echo $this->lol::FOO; // fail. parse error.. wtf 
    } 
} 

$w = new WWW; 
$w->doSMth(); 

:(

Tôi biết tôi chỉ có thể làm echo LOL::FOO, nhưng nếu tên lớp không xác định? Từ vị trí đó tôi chỉ có quyền truy cập vào đối tượng/thuộc tính đó và tôi thực sự không muốn lớp WWW đó "nhận thức" về ot lớp học của cô và tên của họ. Nó chỉ nên làm việc với đối tượng đã cho

+0

thử $ w = new WWW (LOL mới); ? – Gntem

+0

Nhưng nếu tên lớp chưa được biết, làm thế nào bạn có thể biết nó có 'const FOO' để bắt đầu? (trừ khi tất cả các lớp của bạn đang thực hiện một số giao diện hoặc mở rộng một số lớp học) –

+0

bởi vì nó hy vọng rằng hằng số có mặt: P – Alex

Trả lời

1

Nếu không biết tên lớp, bạn có thể sử dụng ReflectionClass để nhận được hằng số. Lưu ý rằng bạn phải sử dụng PHP 5 trở lên.

Ví dụ:

$c = new ReflectionClass($this->lol); 
echo $c->getConstant('FOO'); // 1 

Tính đến PHP 5.3.0, bạn có thể truy cập liên tục qua một biến chứa tên lớp:

$name = get_class($this->lol); 
echo $name::FOO; // 1 

Mọi chi tiết, thấy Scope Resolution Operator - PHP

2

Bạn có thể làm điều này dễ dàng hơn nhiều bằng cách chỉ định thuộc tính lol cho biến cục bộ, như vậy:

public function doSMth(){ 
    $lol = $this->lol; 
    echo $lol::FOO; 
} 

Điều này vẫn ngớ ngẩn nhưng ngăn không cho sử dụng phản xạ.

0
$lol = &$this->lol; 
echo $lol::FOO; 
.. 
unset($lol); 
+1

Chào mừng bạn đến với SO. Thêm giải thích ngắn gọn là thông thường khi bạn thêm câu trả lời. –

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