※ 正確なタイトルは「クラスプロパティの値を代入する際は、__construct()
を使わない限り、動的な値を代入することができないようです。」です。
あらまし
ぼく「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ー