PHP Warning: Use of undefined constant … – assumed “…” とは
PHP開発中に、突然 Undefined constant という警告が表示されて、画面表示が崩れたり、意図しない挙動になったりして困った経験はありませんか? この警告は、プログラマーが定数として扱おうとした文字列が、PHPによって文字列リテラルとして解釈された結果発生することがほとんどです。特にフレームワークを使っていると、思わぬ場所で遭遇することもあります。

このエラー、初めて見た時は「なんで文字列なのに怒られるんだ!?」って焦りますよね! PHPが定数と文字列を区別しようとするがゆえの挙動なんです。
実行環境ごとのエラーメッセージ
| 環境 | エラーメッセージ |
|---|---|
| PHP 7.x (CLI) | PHP Warning: Use of undefined constant APP_NAME - assumed 'APP_NAME' (this will throw an Error in a future version of PHP) in /path/to/your/script.php on line X |
| PHP 8.x (CLI) | PHP Warning: Undefined constant APP_NAME in /path/to/your/script.php on line X |
| XAMPP/MAMP (ブラウザ) | Warning: Use of undefined constant APP_NAME - assumed 'APP_NAME' (this will throw an Error in a future version of PHP) in /path/to/your/script.php on line X |
エラーの発生パターン
このエラーは主に以下のようなケースで発生します。
パターン1: 文字列リテラルを定数として扱ってしまう
<?php
// 'Hello World' を出力したいのに、引用符を忘れている
echo Hello World;
?>
PHPは Hello を未定義の定数と解釈し、続いて World も未定義の定数として解釈します。結果として、PHPはこれらの定数を同名の文字列リテラルとして扱い、Hello World という文字列が出力されますが、警告が発生します。これはPHPが自動的に補完する挙動によるものです。
<?php
// 正しく引用符で囲んで文字列リテラルとして指定
echo 'Hello World';
// またはダブルクォート
echo "Hello World";
?>
パターン2: 配列のキーを引用符なしで指定する
<?php
$data = ['name' => 'Alice', 'age' => 30];
// 'name' キーを引用符なしでアクセス
echo $data[name];
?>
配列のキーは文字列リテラルとして指定する必要がありますが、引用符を忘れるとPHPは name を定数として解釈します。name という定数が定義されていないため、Undefined constant 警告が発生し、結果的に文字列 'name' として扱われます。
<?php
$data = ['name' => 'Alice', 'age' => 30];
// 正しく引用符で囲んでキーを指定
echo $data['name'];
?>
パターン3: define() や const で定義されていない定数へのアクセス
<?php
// APP_VERSION 定数がどこにも定義されていない
// define('APP_VERSION', '1.0.0'); の行をコメントアウトしていると仮定
echo APP_VERSION;
?>
APP_VERSION は定数として使用されていますが、define() 関数や const キーワードで事前に定義されていません。この場合もPHPは APP_VERSION を同名の文字列リテラルとして扱いますが、警告が出力されます。
<?php
// define() 関数で定数を定義してから使用
define('APP_VERSION', '1.0.0');
echo APP_VERSION;
// または const キーワードでクラス定数を定義
class App {
const APP_NAME = 'My Application';
}
echo App::APP_NAME;
?>




特に配列のキーを引用符なしで書いちゃうパターンは、多くの人が一度は経験する『あるある』だと思います。PHPの柔軟性が裏目に出る典型例ですね。
よくあるバリエーション
Undefined constant "ENV" の場合
Laravelなどのフレームワークで ENV 定数を参照しようとして発生することがあります。多くのフレームワークでは環境変数を $_ENV や getenv()、または専用のヘルパー関数(Laravelの env() など)で取得するため、ENV というグローバル定数は存在しない場合が多いです。代わりに env('APP_ENV') のように記述する必要があります。
<?php
// bad_code
if (ENV === 'local') { /* ... */ }
// good_code (Laravelの場合)
if (env('APP_ENV') === 'local') { /* ... */ }
// good_code (汎用的なPHPの場合)
if (getenv('APP_ENV') === 'local') { /* ... */ }
?>
Undefined constant "ROOT_PATH" の場合
アプリケーションのルートパスを定数で管理しようとした際に、その定数が適切に定義されていないと発生します。特に古いPHPアプリケーションや、フレームワークを使わない自作アプリケーションでよく見られます。ファイルのインクルードパスなどで利用されることが多いです。
<?php
// bad_code
require_once ROOT_PATH . '/config/app.php';
// good_code
define('ROOT_PATH', __DIR__); // __DIR__ は現在のファイルのディレクトリパス
require_once ROOT_PATH . '/config/app.php';
?>
Undefined constant "APP_DEBUG" の場合
デバッグモードのON/OFFを制御する定数 APP_DEBUG が未定義の場合に発生します。本番環境と開発環境で挙動を切り替える際に、設定ファイルの読み込み漏れや定義忘れが原因となることがあります。フレームワークでは APP_DEBUG は環境変数として扱われることが多いです。
<?php
// bad_code
if (APP_DEBUG) { /* debug mode specific logic */ }
// good_code
define('APP_DEBUG', true); // または環境変数から取得
if (APP_DEBUG) { /* debug mode specific logic */ }
?>
フレームワーク別の発生パターン
Laravel (Bladeテンプレート)での発生パターン
LaravelのBladeテンプレートで、JavaScript変数にPHP変数を渡す際に、キーを引用符で囲み忘れるとこのエラーが発生することがあります。特に、動的な値を渡す際に起こりがちです。
<!-- bad_code.blade.php -->
<script>
const userId = {{ $user->id }};
// 設定値をPHPから取得したいが、キーを引用符で囲み忘れる
const apiUrl = '{{ config(api.url) }}'; // ここでUndefined constant 'api' が発生
</script>
<!-- good_code.blade.php -->
<script>
const userId = {{ $user->id }};
// config関数のキーを正しく引用符で囲む
const apiUrl = '{{ config('api.url') }}';
</script>
Symfony (YAML設定ファイル)での発生パターン
SymfonyアプリケーションでYAML設定ファイルを使用し、その中でPHPの定数を参照する場合、PHPコード側で定数が定義されていないとこの警告が発生します。特に環境変数やパスの定数で起こりやすいです。
# bad_config.yaml
parameters:
app.root_dir: %kernel.project_dir%/%APP_ROOT_DIR% # APP_ROOT_DIRが未定義
// config/services.php (または config/packages/*.php) でAPP_ROOT_DIRが定義されていない
# good_config.yaml
parameters:
app.root_dir: %kernel.project_dir%/%env(APP_ROOT_DIR)%
// config/services.php
define('APP_ROOT_DIR', 'src'); // PHP側で定数を定義
// または .env ファイルで環境変数を定義
// .env
// APP_ROOT_DIR=src



デバッグの基本は、エラーメッセージに書かれたファイルと行番号を信じることです! 落ち着いてその周辺のコードを見てみましょう。
根本原因の特定方法
このエラーが発生した場合、まずはエラーメッセージに表示されている ファイル名と行番号 を確認してください。その行のコードで、文字列が引用符で囲まれていないか、または参照しようとしている定数が事前に define() や const で定義されているかをチェックします。もし複雑なロジックの中で発生している場合は、var_dump() や echo を使って、その周辺の変数の値や型を確認すると原因特定のヒントになります。
<?php
// エラーが発生する可能性のあるコード
// echo $data[key];
// デバッグのために、エラー行の直前で変数の内容を確認
var_dump($data);
// 問題の行(ここではコメントアウトして例示)
// echo $data[key];
?>
PHPバージョン別の挙動の違い
PHPの Undefined constant 警告は、バージョンアップによってそのメッセージや将来の挙動が示唆されてきました。PHP 7.x系では assumed '...' (this will throw an Error in a future version of PHP) というメッセージが追加され、将来的にこの警告がエラーに昇格する可能性が示唆されていました。しかし、PHP 8.0以降でもこの警告は Warning のままで、Error には昇格していません。それでも、この警告は意図しない挙動を引き起こす可能性があるため、放置せず修正することが強く推奨されます。将来的に Error になった場合、アプリケーションが即座に停止する原因となります。
防止策とベストプラクティス
このエラーを未然に防ぐ最も効果的な方法は、文字列リテラルは常にシングルクォートまたはダブルクォートで囲む習慣を徹底することです。また、定数を使用する場合は、必ず define() や const を使って明確に定義するようにしましょう。開発環境にLinter(例: PHP_CodeSniffer, Psalm, PHPStan)を導入することで、コードの静的解析時にこれらの潜在的な問題を早期に発見し、修正することができます。
<?php
// 常に文字列を引用符で囲む
echo 'これは文字列です';
// 定数を定義してから使用する
define('MAX_ITEMS', 100);
// const MAX_ITEMS = 100; // クラス内で使用
echo MAX_ITEMS;
?>



Linterは本当に便利ですよ。書いている最中に警告してくれるので、本番環境でこのエラーが出るリスクを大幅に減らせます!
Stack Overflowでの質問状況
Stack Overflowでは、PHPに関する質問が約1,466,015件投稿されており、PHP Warning: Use of undefined constant … – assumed “…”は最も頻繁に質問されるエラーカテゴリの一つです。




この警告は放置しがちですが、意図しない挙動や将来のエラーに繋がる可能性があるので、見つけたらすぐに修正しておきましょう!
よくある質問(FAQ)
-
Q
Undefined constantが出てもアプリケーションが動くのはなぜですか? -
A
PHPは未定義の定数を検出すると、自動的にその定数名を文字列リテラルとして扱おうとします。この「補完」によって処理が続行されるため、警告は出るものの、直ちにプログラムが停止するわけではありません。しかし、これは意図しない挙動やセキュリティリスクにつながる可能性があるため、修正が必須です。
-
Q本番環境でのみ
Undefined constantが発生するケースはありますか? -
A
はい、あります。開発環境と本番環境でPHPの設定(
error_reportingレベルなど)や、読み込まれる設定ファイル(環境変数含む)が異なる場合に発生しやすいです。特に本番環境で特定の定数が定義されていない、または環境変数の読み込みに失敗している場合などが考えられます。
-
QLaravelやSymfonyでこのエラーが出た場合、どのように対処すれば良いですか?
-
A
フレームワークでは、定数よりも環境変数(
env()ヘルパーや.envファイル)や設定ファイル(config()ヘルパー)を使うのが一般的です。BladeテンプレートやTwigテンプレートで変数を扱う際も、キーが文字列であることを意識して引用符で囲むようにしましょう。フレームワーク固有のヘルパー関数や設定の読み込み方を確認することが重要です。
-
QこのエラーをLinterや静的解析ツールで事前に検知できますか?
-
A
はい、可能です。PHP_CodeSniffer、Psalm、PHPStanなどの静的解析ツールを導入することで、コードを実行する前に未定義の定数参照を検知し、警告してくれます。CI/CDパイプラインにこれらのツールを組み込むことで、開発段階でエラーを早期に発見し、本番環境へのデプロイを防ぐことができます。
-
Qエラー発生時のユーザー向けエラーハンドリングはどのようにすべきですか?
-
A
Undefined constantは基本的には開発者が修正すべき警告であり、ユーザーに直接表示すべきではありません。本番環境では、display_errorsをOffに設定し、警告がログファイルに記録されるようにlog_errorsをOnに設定します。ユーザーには、一般的なエラーページ(例: 「サーバーエラーが発生しました」)を表示するようにします。




コメント