2011-06-28 33 views
5

Tôi đang cố gắng để khai báo một biến public static đó là một mảng của các mảng:Công giá trị biến tĩnh

class Foo{ 
public static $contexts = array(
    'a' => array(
     'aa'    => something('aa'), 
     'bb'    => something('bb'), 
    ), 

    'b' => array(
     'aa'    => something('aa'), 
     'bb'    => something('bb'), 
    ), 

); 

// methods here 

} 

function something($s){ 
    return ... 
} 

Nhưng tôi nhận được một lỗi:

Parse error: parse error, expecting `')'' in ...

+0

'something()' là gì? Ngoài ra, điều này được khai báo là thuộc tính lớp ('public static $ contexts') hay một nơi nào đó trong một phương thức? – deceze

+0

nó là một chức năng bình thường .. nó được khai báo bên ngoài lớp. biến được khai báo là thuộc tính lớp – Alex

+0

"được khai báo bên ngoài lớp"? Chúng ta có thể thấy bit bit này ở đâu với phần còn lại của lớp không? – BoltClock

Trả lời

9

Bạn không thể sử dụng cụm khi khai báo thuộc tính lớp. I E. bạn không thể gọi something() ở đây, bạn chỉ có thể sử dụng giá trị tĩnh. Bạn sẽ phải đặt các giá trị khác nhau trong mã tại một số điểm.

Like any other PHP static variable, static properties may only be initialized using a literal or constant; expressions are not allowed. So while you may initialize a static property to an integer or array (for instance), you may not initialize it to another variable, to a function return value, or to an object.

http://www.php.net/manual/en/language.oop5.static.php

Ví dụ:

class Foo { 
    public static $bar = null; 

    public static function init() { 
     self::$bar = array(...); 
    } 
} 

Foo::init(); 

Hoặc làm điều đó trong __construct nếu bạn đang đi để nhanh chóng lớp.

+0

đó là lạ, bởi vì tôi chỉ có thể tuyên bố một chức năng tĩnh công cộng sẽ trả về mảng của tôi, nó sẽ là cùng một – Alex

+1

Các giá trị ban đầu của thuộc tính lớp được tạo ra trong khi mã nguồn được phân tích cú pháp. Tại thời điểm đó bộ nhớ cần phải được dành riêng cho những giá trị lớp ban đầu vì chúng cần phải được lưu trữ ở đâu đó. Điều này xảy ra trước khi mã thực sự được thực hiện. Bạn không thể đặt trước bộ nhớ cho giá trị trả về của một hàm mặc dù, vì một hàm có thể trả về bất cứ điều gì. Và kể từ khi phân tích cú pháp chưa hoàn thành, các hàm chưa thể được thực thi. Do đó, trong khi * phân tích cú pháp * mã, chỉ cho phép các giá trị tĩnh của kích thước đã biết. Một hàm được (rõ ràng) được gọi sau này trong thời gian chạy và có thể trả về bất cứ điều gì. – deceze

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