2012-02-18 7 views
3

静的コンテキストのときにPHPでマジック定数(__DIR__など)を使用することを拒否する特別な理由はありますか?静的コンテキストでマジック定数を使用できないのはなぜですか?

class MyClass 
{ 

    protected static $options = array(
      'key1' => 2, 
      'key2' => __DIR__ .'/mypic.png' // Triggers a syntax error 
    ); 

    public function __construct() {} 

} 

EDIT質問について明確化:OOP POVは__DIR__が特定のインスタンスではないという「グローバル」であるため、何も間違っていないようです。私は「なぜ」それが不可能であることに興味があります。例えば、静的なものについて言えば、誰もがこれが不可能であることを知っている:

public static function getName() { return $this->name; } 

静的関数が「知らない」のでgetName()はどのようなインスタンスを参照するために複数のインスタンス間で共有され、$this->nameはどんな意味がないので、 。

答えて

4

ここでは、特に__DIR__やマジック定数は使用できませんが、これは許可されていません。これは、許可されていないプロパティ定義内の何かを動的に構築することです。また、静的なプロパティ定義内で"a" . "b"のような2つのアトミックな文字列を連結しようとすると、構文エラーが発生します。他のPHP静的変数と同様

From the docs:

、静的プロパティは、リテラルまたは定数を使用して初期化することができます。式は許されません。したがって、静的なプロパティを整数や配列(たとえば)に初期化することはできますが、別の変数、関数の戻り値、またはオブジェクトに初期化することはできません。また、連結しても、定数にもカウントされます許可されていない表現として。式の結果と静的変数を初期化すると、解析エラーである理由

PHPマニュアルには、指定されていませんが、それが原因static declarations are resolved at compile timeは、実行時ではないという事実のために可能性があります。

+0

ありがとう、本当に知っていますが、実際には実際の質問には答えられません。そのため、「物理的に」とは言えません。 – gremo

+0

おそらく、initの値はコンパイル時に決定されます(つまり、PHPはZendエンジンのオペコードにコンパイルされます)。実行時ではありません。 –

+0

@Gremo私の追加を参照してください。このマニュアルでは理由として明示的に述べられていませんが、コンパイル時に実行時ではなく静的プロパティが解決されるためです。 –

関連する問題