2012-08-23 22 views
5

Tôi có một câu hỏi liên quan đến "năng động" class Initialising, hãy để tôi giải thích những gì tôi muốn nói:

$class = 'User'; 
$user = new $class(); 

//...is the same as doing 
$user = new User(); 

... Vì vậy, đó không phải là vấn đề, nhưng tôi đang gặp một số rắc rối làm như vậy khi gọi một biến tĩnh từ một lớp học, ví dụ:

$class = 'User'; 
print $class::$name; 

nào đưa ra được lỗi sau:

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in

Tất nhiên tôi đã thử nghiệm làm print User::$name; và hoạt động. Vì vậy, lớp học hoạt động.

Tại sao điều này và có cách nào đó?

Theo dõi câu hỏi:
Ngoài ra là có bất kỳ lý do chính đáng để không sử dụng theo cách này "năng động" trong việc tạo ra các lớp học?

+0

bạn không thể kết hợp các cuộc gọi động và tĩnh, đó là lý do tại sao không thể gọi User :: $$ prop và cả $ class :: $ name –

+0

http://stackoverflow.com/questions/3679717/unexpected-t của bạn -paamayim-nekudotayim-on-one-máy tính-nhưng-không-khác-với-php-5 –

+1

có thể trùng lặp của [Truy cập biến tĩnh bởi $ var :: $ reference] (http://stackoverflow.com/questions/ 675676/truy cập-một-tĩnh-biến-by-varreference) –

Trả lời

1

Nếu bạn không có phiên bản PHP 5.3 và ở trên, và bạn không muốn sử dụng sự phản chiếu (theo ý kiến ​​của tôi là quá mức cần thiết - trừ khi bạn muốn truy cập nhiều thuộc tính tĩnh), bạn có thể xác định hàm getter và gọi nó qua call_user_func():

class A { 
    public static $var = "Hello"; 
    public static function getVar() { 
     return self::$var; 
    } 
} 
$className = "A"; 
echo call_user_func(array($className, 'getVar')); 
+0

Vâng, đó chắc chắn là một công việc xung quanh vấn đề ... Cảm ơn! – jamietelin

+0

Giải pháp thay thế dễ dàng hơn; '$ vars = get_class_vars ($ className);' – jamietelin

2

Mã này hoạt động tốt trên PHP 5.4.3:

<?php 

class A { 
    public static $var = "Hello"; 
} 

print(A::$var); 

$className = "A"; 
print($className::$var); 

?> 
+2

Cũng hoạt động trong 5.3.2 –

+2

Đây là mã mà OP có. Có lẽ (mặc dù ông đã không nói) ông phải sử dụng một phiên bản trước của PHP. –

+1

Vâng, sau đó tôi biết nó là phiên bản PHP của tôi đó là vấn đề. :) Cảm ơn! – jamietelin

2

Đây là câu trả lời từ câu hỏi tôi liên kết trong các ý kiến:

You can use reflection to do this. Create a ReflectionClass object given the classname, and then use the getStaticPropertyValue method to get the static variable value.

class Demo 
{ 
    public static $foo = 42; 
} 

$class = new ReflectionClass('Demo'); 
$value=$class->getStaticPropertyValue('foo'); 
var_dump($value); 
+0

sử dụng phản xạ có vẻ là giải pháp quá mức trừ khi bạn muốn sử dụng nó trên số lượng lớn các thuộc tính của các lớp tĩnh, nhưng vâng, sử dụng sự phản chiếu cũng sẽ mang lại cho bạn kết quả cần thiết –

+1

Ngoài ra, có vẻ như thông báo lỗi OP đang sử dụng phiên bản php trước phiên bản nào (5.3.something) có hỗ trợ thích hợp cho các lớp tĩnh và các biến lớp tĩnh và vì vậy đây có thể là tùy chọn tốt nhất. –

+0

Sự khác biệt thực sự ở đây chỉ là tạo ra lớp "thực sự" và sau đó nhận được biến của tôi? Giống như: '$ user = new $ class(); in $ user-> name; '? Có hiệu suất đạt được từ việc sử dụng Reflection? – jamietelin

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