はじめに
PHPで開発をしていると、ある日突然こんなエラーメッセージに出会うことがあります。
Fatal error: Constant expression contains invalid operations
一見すると難しそうな英語ですが、これは「定数として評価できない操作が含まれています」という意味です。特にstatic
変数やconst
を使う場面で、関数を呼び出して初期化しようとしたときによく発生します。
本記事では、このエラーがなぜ起きるのか、どう回避すればいいのかを図解付きで解説します。
「コンパイル時評価」と「実行時評価」の違いを理解すれば、同じミスを繰り返さずに済みます。
目次
エラーが出るコード例
次のコードを実行すると、エラーが発生します。
<?php
declare(strict_types=1);
error_reporting(-1);
function f(){
static $i = pow(1,2);
}
f();
実行結果:
Fatal error: Constant expression contains invalid operations in /var/www/html/p26.php on line 6
PHPではstatic
変数、クラス定数、const
の初期化に使えるのは「コンパイル時に評価できる定数式」のみです。リテラルや演算子で作れる値はOKですが、関数呼び出しは基本NGです。
定数式・・・プログラムの実行中に値が変化しない式のことを指します。例:3、2+5など固定されるもの
pow(1, 2)
は関数呼び出しなので、コンパイル時に値を決められず、エラーになります。
pow()関数・・・べき乗を計算するための関数
図解:コンパイル時評価と実行時評価の違い
コンパイル時評価(OKパターン)
コード: static $i = 1 ** 2;
[コンパイル時] 1 ** 2 = 1
[実行時] 既に値が決まっているので即利用
実行時評価(NGパターン)
コード: static $i = pow(1, 2);
[コンパイル時] pow()は関数呼び出し → 値がまだわからない
[実行時] 値を決めたいが、静的変数の初期化では不可
解決方法
演算子を使う(定数式に置き換える)
function f(){
static $i = 1 ** 2; // OK
}
初回実行時に代入する
function f(){
static $i;
if ($i === null) {
$i = pow(1, 2);
}
}
まとめ
- PHPの
static
変数初期化はコンパイル時に計算できる定数式のみOK - 関数呼び出しは基本的にNG
- 演算子で置き換えるか、初回実行時に代入する方法で回避可能
- 「コンパイル時評価」と「実行時評価」の違いを理解するとエラー原因が明確になる