《PHP8上級試験対策》PHPで「Constant expression contains invalid operations」エラーが出る理由

  • URLをコピーしました!

はじめに

PHPで開発をしていると、ある日突然こんなエラーメッセージに出会うことがあります。

Fatal error: Constant expression contains invalid operations

一見すると難しそうな英語ですが、これは「定数として評価できない操作が含まれています」という意味です。特にstatic変数やconstを使う場面で、関数を呼び出して初期化しようとしたときによく発生します。

本記事では、このエラーがなぜ起きるのか、どう回避すればいいのかを図解付きで解説します。
「コンパイル時評価」と「実行時評価」の違いを理解すれば、同じミスを繰り返さずに済みます。

キーワード:static変数 / 定数式 / 関数呼び出し / コンパイル時評価 / 実行時評価

目次

エラーが出るコード例

次のコードを実行すると、エラーが発生します。

<?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
  • 演算子で置き換えるか、初回実行時に代入する方法で回避可能
  • 「コンパイル時評価」と「実行時評価」の違いを理解するとエラー原因が明確になる

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次