2011-02-20 31 views
14

Tôi đang cố gắng truy cập một phương thức tĩnh, nhưng sử dụng một biến làm tên lớp. Điều này có thể không? Tôi dường như có vấn đề với nó. Tôi muốn có thể làm một việc như sau:truy cập các phương thức tĩnh sử dụng tên lớp biến (PHP)

class foo { 
    public static function bar() { 
     echo 'test'; 
    } 
} 

$variable_class_name = 'foo'; 
$variable_class_name::bar(); 

Và tôi cũng muốn có thể thực hiện tương tự bằng các biến tĩnh.

+1

tác phẩm này tốt cho tôi trên php 5.3.2. –

+0

sử dụng 5.2 tôi tin. gặp lỗi như "Lỗi phân tích cú pháp: lỗi cú pháp, T_PAAMAYIM_NEKUDOTAYIM không mong đợi trong /some/path/application/models/lev_base_model.php trên dòng 35" – dqhendricks

+0

Bạn đang chạy phiên bản PHP nào? Theo như tôi biết bạn đã có thể làm điều này trong các phiên bản gần đây (5.2+, mặc dù không chính xác chắc chắn khi nào điều này hợp lệ) – GordonM

Trả lời

17

Cú pháp đó chỉ được hỗ trợ trong PHP 5.3 trở lên. Các phiên bản trước không hiểu cú pháp đó, do đó lỗi phân tích cú pháp của bạn (T_PAAMAYIM_NEKUDOTAYIM là toán tử ::).

Trong các phiên bản trước, bạn có thể thử call_user_func(), đi qua nó một mảng chứa tên lớp và tên phương pháp của nó:

$variable_class_name = 'foo'; 
call_user_func(array($variable_class_name, 'bar')); 
+0

... nên có giải pháp nào không? – dqhendricks

+0

@dqhendricks: xem chỉnh sửa của tôi – BoltClock

+0

có vẻ tuyệt vời. Có cái gì đó tương tự cho các thuộc tính tĩnh? – dqhendricks

7

Bạn có thể sử dụng reflection cho PHP 5.1 trở lên:

class foo { 
    public static $bar = 'foobar'; 
} 

$class = 'foo'; 
$reflector = new ReflectionClass($class); 
echo $reflector->getStaticPropertyValue('bar'); 

> foobar 
+0

+1 Rất hay, tôi sẽ quên lãng quên sự phản chiếu. – BoltClock

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