40
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PHP】クラスプロパティの値には、動的な値を代入することができないようです。

Last updated at Posted at 2020-07-17

※ 正確なタイトルは「クラスプロパティの値を代入する際は、__construct()を使わない限り、動的な値を代入することができないようです。」です。

あらまし

ぼく「PHPでクラスのプロパティを定義するぞ!」
ぼく「プロパティの定義なんて慣れたもんだぜ…カキカキ」

ぼくのかんがえたさいきょうのクラス.php
class クラス {
    private $プロパティ = [
        strtotime('yesterday'),
        strtotime('today'),
        strtotime('tomorrow'),
    ];
}

PC「PHP Fatal error: Constant expression contains invalid operations in /ぼくのかんがえたさいきょうのクラス.php on line 5

ぼく「はっ?」
PC「せやから、PHP Fatal error: Constant expression contains invalid operations in /ぼくのかんがえたさいきょうのクラス.php on line 5やで?」

ぼく「…。」
ぼく「意味わからん、日本語で言えや。」
PC「日本語でいうと定数式に無効な操作が含まれていますってことや。」

ぼく「定数式(const)は使ってないぞ!」
PC「知らんけど、とにかくエラー解決しないとコード動かせへんからな。ほなよろしく〜。」
ぼく「そ、そんな…」

それから10年の月日を経て…。

ぼく「うーん、うーん」
ぼく「定数宣言してないのに定数式のエラー…意味わからん…うーん、うーん」
ぼく「どんな配列なら定義できるんだ?」

    private $プロパティ = [
        'yesterday',
        'today',
        'tomorrow',
    ];

PC「これならイケるで!」

    private $プロパティ = [
        strtotime('yesterday'),
        'today',
        'tomorrow',
    ];

PC「これはムリやで」

ぼく「えっ…?まさか…。」

    private $プロパティ = strtotime('yesterday');

PC「だからムリやっちゅーに」

ぼく「…。」
ぼく「おいおいおいおい!」
ぼく「まさかクラスプロパティの値には、関数の返り値を使うことができないのか!?」

PC「ハァ…しょうがない調べたるわ」
カタカタカタ…チーン!
PC「PHP公式様のありがたい御言葉によるとな、関数の返り値どころか、変数展開すらムリらしいで。」

初期値は定数値でなければなりません。 つまり、コンパイル時に評価可能な値でなければならず、 実行時の情報がないと評価できない値であってはいけないということです。

(参照元)

PC「ってことは」

    private $プロパティ = $他の変数;

PC「これもムリっちゅうことやな。」
PC「まぁ__construct()使えばええんちゃう?」
ぼく「そんな!このクラスの__construct()には他にもいろんな事をやらせるつもりなんだ!」
ぼく「ただプロパティを定義するだけの処理なんて書き込みたくないんだよ!」
PC「そんなん知らん。嫌なら使うなっちゅう話や。」

ぼく「そ…そんな…」

絶望に暮れた少年は、自らその命を断ったのであった…。

ーBAD ENDー

40
16
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?