2011-07-08 22 views
7

Trong PHP 5.3.6, tôi đã nhận thấy rằng sau đây sẽ không hoạt động:Nhiều nekudotayims paamayim trong PHP, tại sao không?

class Foo{ 
    public static $class = 'Bar'; 
} 

class Bar{ 
    public static function sayHello(){ 
     echo 'Hello World'; 
    } 
} 

Foo::$class::sayHello(); 

Ban hành một unexpected T_PAAMAYIM_NEKUDOTAYIM. Tuy nhiên, sử dụng biến tạm thời sẽ dẫn đến kết quả như sau:

$class = Foo::$class; 
$class::sayHello(); // Hello World 

Có ai biết điều này là do thiết kế hoặc kết quả ngoài ý muốn của nhà điều hành giải pháp phạm vi được mã hóa hay gì đó không? Bất kỳ cách giải quyết nào khác hơn là ví dụ biến tạm thời?

+0

Có thể muốn thử một vectơ cú pháp xoăn về điều này. '{$ {Foo :: $ class}} :: sayHello();' Một cái gì đó như thế có thể hoạt động. Tôi không có một trình phân tích cú pháp PHP trước mặt tôi. –

+0

Cảm ơn @ Tom Tomlin - Thật không may, tôi đã thử mọi kết hợp có thể. Nó luôn luôn kết thúc tìm kiếm '$ Foo' hoặc' $ Bar' – Dan

+0

Nếu tôi nhớ về câu hỏi này, tôi sẽ cung cấp cho nó một đi khi tôi nhận được từ công việc. Mã có hoạt động trước 5.3.6 không? –

Trả lời

2

Rất tiếc, không có cách nào để thực hiện điều đó trong một dòng. Tôi nghĩ bạn có thể làm điều đó với call_user_func(), nhưng không đi:

call_user_func(Foo::$class.'::sayHello()'); 
// Warning: call_user_func() expects parameter 1 to be a valid callback, class 'Bar' does not have a method 'sayHello()' 

Ngoài ra, tại sao bạn muốn làm điều gì đó như thế này ngay từ đầu? Tôi chắc chắn phải có một cách tốt hơn để làm những gì bạn đang cố gắng làm - thường có nếu bạn đang sử dụng biến biến hoặc tên lớp.

+0

Cảm ơn @Mike - Tôi hiểu rằng có rất ít sử dụng cho nó, nhưng "* static chaining *" đã sử dụng trong một số bộ tải động mà tôi đang làm việc. Tất nhiên có những lựa chọn thay thế, nhưng cú pháp này sẽ là một lợi ích có đường để tải helper. – Dan

+1

Cũng giống như @Mike - Nỗ lực của bạn hoạt động với một thay đổi nhỏ; 'call_user_func (mảng (Foo :: $ class, 'sayHello'));' – Dan

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