2011-06-28 9 views
5

私は、配列の配列である公共の静的変数を宣言しようとしています:のpublic static変数値

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 ... 
} 

をしかし、私はエラーを取得する:

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

+0

'something()'とは何ですか?また、これはクラスプロパティ( 'public static $ contexts')またはメソッドのどこかで宣言されていますか? – deceze

+0

通常の関数です。クラス外で宣言しています。変数はクラスプロパティ – Alex

+0

"クラス外で宣言された"として宣言されていますか?このコードの部分がクラスの残りの部分とどこにあるのか確認できますか? – BoltClock

答えて

9

あなたが式を使用することはできませんクラスプロパティを宣言するとき私。 something()はここでは呼び出せません。静的な値しか使用できません。これらの値は、ある時点でコード内で別々に設定する必要があります。例えば

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

class Foo { 
    public static $bar = null; 

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

Foo::init(); 

それとも、クラスをインスタンス化するつもりなら__constructでそれを行います。

+0

私は配列を返すpublic静的関数を宣言できますので、それは変わりません – Alex

+1

クラスプロパティの初期値は、ソースコードが解析されている間に作成されます。その時点で、どこかに格納する必要があるため、初期クラス値のためにメモリを予約する必要があります。これは、コードが実際に実行される前に発生します。関数が何かを返す可能性があるので、関数の戻り値のためのメモリを確保することはできません。また、解析が完了していないため、関数をまだ実行できません。したがって、コードの解析中*は、既知のサイズの静的な値のみが許可されます。関数は後で実行時に(明示的に)呼び出され、何かを返すことがあります。 – deceze

関連する問題