PHP の class を定義してたら PHP Fatal error: Constant expression contains invalid operations in …
というエラーが発生してなんでや!となったのでメモ
環境
- PHP
v7.4
Constant expression contains invalid operations
エラーになった例
<?php class MyClass { private static $resourcePath = get_template_directory() . '/resources'; public static setResourcePath(string $path) { if ( !is_dir($path) ) { throw new \InvalidArgumentException('Invalid resource path'); } self::$resourcePath = $path; } public function __construct() { … } }
プロパティに wordpress のテーマへのパスを持ったクラスを作っていた所 private static $resourcePath =
の箇所で上記の PHP Fatal error: Constant expression contains invalid operations in …
エラーが発生しました
PHP のクラスのプロパティの初期値は定数しか取れない
宣言時に初期値を設定することもできますが、 初期値は 定数 値でなければなりません。
cf. PHP: プロパティ - Manual
つまりプロパティに関数の実行が入っているのが良くなかった。と言うことっぽい
1. 定数にすればOK
定数にしてしまえば問題はない。(class 内でプロパティが定義される前に定数になっているからだと思われる)
<?php define('RESOURCES_DIR', get_template_directory() . '/resources'); class MyClass { private static $resourcePath = RESOURCES_DIR; // ... public function __construct() { … } }
2. コンストラクタで初期値を設定する
そもそも class プロパティの初期値を設定しなければ問題にならない
static プロパティの場合インスタンス化しないと初期値が設定されないのが問題にはなるけれど…
<?php class MyClass { private static $resourcePath; // ... public function __construct() { if ( empty(self::$resourcePath) ) { self::$resourcePath = get_template_directory() . '/resources'; } // … } }
🙅 変数は class プロパティに設定できない
define
で定義した定数はOKだが、変数は エラーが発生になる
<?php class MyClass { private static $resourcePath = $resource_dir; // ... public function __construct() { … } }
=> Constant expression contains invalid operations
(そもそも変数のスコープの問題があるのが…)
三畳紀ぶりに PHP を触っているので全てを忘れている…
ドキュメントの探し方のコツも忘れているので、これじゃない情報が検索で出てきすぎて PHP つらい…
おわり₍ ᐢ. ̫ .ᐢ ₎
[参考]
最近疲れが全然取れなくて困ってる…