2016-06-17 3 views

答えて

3

これはPHPコンパイラの制限であり、それはdocumentationで説明されている:

他のPHP静的変数と同様に、静的プロパティのみPHP 5.6の前にリテラルまたは定数を使用して初期化することができます。式は許されません。 PHP 5.6以降では、const式と同じ規則が適用されます。コンパイル時に評価できるものであれば、いくつかの限定された式が可能です。

ここでの重要なステートメントは、「コンパイル時に評価できるのであれば」です。

あなたが受け取ったエラーメッセージから、あなたはPHP 5を使用していると言えるでしょう。PHP 7では、問題を明確に述べるためにエラーメッセージが書き換えられました。 "定数式に無効な操作が含まれています"と表示されています。

最初の静的変数($one)の宣言は、定数式で初期化するためコンパイルされます。 ['a','b']は文字列の配列であり、コンパイル時に評価することができ、すべて正常です。

第2の静的変数($two)は、非定数式(Test::$one)で初期化されます。 Test::$oneは変数です。その値の初期値はコンパイル時にわかっていることがわかり(上記の項を参照)、式はコンパイル時に評価できます。

この種の動作では、コンパイル時にコードを深く分析する必要があります。おそらくC++やJavaコンパイラで実装されていますが、これらは一度だけコンパイルされた言語であり、生成されるコードはファイルに格納され、後で実行または解釈されます。このような理由でPHPコンパイラは動作しません。各実行の前にスクリプトをコンパイルするので、できるだけ早くコンパイルを完了させることが目的であり、コード分析や最適化にはあまり努力しません。

更新:@decezeはcommentで指定したように、それは完全にこの時点で定義されていないクラスTestを使用するため

、式Test::$one$twoの宣言で評価することができません。この種の参照を許可する他の言語のコンパイラでさえ、の宣言に達するとTest::$oneという値を計算することはできません。それを評価するには、2番目のコンパイルパスを使用する必要があります。

+0

さらに、 'Test :: $ one'は' Test'クラス定義の解析がまだ完了していないため、この時点では利用できません。 – deceze

関連する問題