2010-11-28 10 views
8

これはうまくいかないコードです:PHPのクラス属性にクラス定数を使用するには?

class MyClass 
{ 
    const myconst = 'somevalue'; 

    private $myvar = array(0 => 'do something with '.self::myconst); 
} 

クラス定数は「コンパイル時」には利用できませんが、実行時にのみ使用できます。誰か回避策を知っていますか? (定義は機能しません)

ありがとう

+0

もしあなたがCマクロのようなものを探しているのであれば、PHPはそのようには動作しません。さらに、「コンパイル時間」はありません。 PHPはインタプリタです。 – stillstanding

+0

マニュアルを書いた人は、「コンパイル・タイム」があるという印象を受けているようです。 http://www.php.net/manual/en/language.oop5.properties.php –

+0

PHP内部ではテキストコードをバイトコードに変換するので、「コンパイル時」(ソート)があります。 – Antoine

答えて

10

問題をあなたは定数を使用していることはありませんが、式を使用していること。

クラスメンバ変数は「プロパティ」と呼ばれます。 (...)それらは、public、protected、privateのいずれかのキーワードを使用して定義され、その後に通常の変数宣言が続きます。この宣言には初期化、 が含まれていますが、この初期化は定数値でなければなりません。つまり、コンパイル時に評価できる必要があり、評価するためにランタイム情報に依存してはいけません。

この簡単な宣言、例えば、コンパイルされません(パースエラー):

class MyClass{ 
    private $myvar = 3+2; 
} 

しかし、私たちは、むしろそれがすることを定数と連結した文字列よりも、単純な定数を使用するようにクラス宣言を変更した場合期待どおりに動作します。回避策あなたは、コンストラクタであなたのプロパティを初期化することができよう

class MyClass{ 
    const myconst = 'somevalue'; 
    public $myvar = array(0 => self::myconst); 
} 

$obj = new MyClass(); 
echo $obj->myvar[0]; 


アリン、私はこれがあなたの役に立てば幸い

class MyClass{ 
    const myconst = 'somevalue'; 
    public $myvar; 

    public function __construct(){ 
     $this->myvar = array(0 => 'do something with '.self::myconst); 
    } 
} 
$obj = new MyClass(); 
echo $obj->myvar[0]; 

+0

はい私はそれを知っていました...私は最初に配列を "const"しようとしましたが、PHPはそれを許可しません。そして、基本的な "定義"(実際のもの、C/C++の#define)はPHPには存在しないようです。だから誰も回避策がありますか? – Antoine

+0

@Antoine最新の編集をご覧ください。これは私が考えることができることのすべてであり、コンストラクタで初期化するのが受け入れられるメソッドだと言います。 –

+0

ありがとう、それは私の問題を解決する良い方法です! – Antoine

0

なおPHP 5.6と上記そうすることが可能です。

https://secure.php.net/manual/en/migration56.new-features.phpを参照してください:

そのような定数やプロパティの宣言とデフォルトの機能として、PHPは以前に静的な値を期待文脈で数値と文字列リテラルおよび/または定数を含むスカラ式を提供することが可能になりました議論

関連する問題