- カテゴリ: PHP
- 掲載バージョン: PHP 8.4
- 名前空間 / FQCN / コマンド:
constant(string $name): mixed - 関連: define / defined / get_defined_constants / const / クラス定数
- 変更履歴: PHP 8.1 以降、
Enum::CASEも取得対象に(ケースはUnitEnum/BackedEnumインスタンス)
要点(TL;DR)
- 文字列の定数名から、その値を取得する
constant('APP_NAME')- 罠: 未定義名で例外、完全修飾名が必要(名前空間・クラス定数)、性能的に多用しない
概要
constant() は、変数で組み立てた「定数名」から動的に値を取り出す関数です。クラス定数(ClassName::CONST)や名前空間定数にも対応し、PHP 8.1+ では Enum::CASE の取得も可能。設定値テーブルやマッピングを「定数で持つ」コードで、名前を動的決定したい場面に使います。
構文 / シグネチャ
function constant(string $name): mixed
- 引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| $name | string | ✔ | なし | 取得する定数の完全修飾名。例: 'APP_NAME', 'App\Config::RETRIES', 'App\Status::OPEN' |
- 戻り値:
mixed(定数の値。Enum の場合はUnitEnum/BackedEnumインスタンス) - 例外/副作用:未定義名や不正名で Error(実装により
Error/ValueErrorなど)。存在確認はdefined()を併用。
使用例
最小例
<?php
define('APP_NAME', 'MyApp');
echo constant('APP_NAME'); // MyApp
実務例(クラス定数・Enum を動的に)
<?php
namespace App;
class Config {
public const RETRIES = 3;
}
enum Status { case OPEN; case CLOSED; }
$constName = Config::class.'::RETRIES';
$retries = constant($constName); // 3
$caseName = Status::class.'::OPEN';
$case = constant($caseName); // Status::OPEN (UnitEnum)
if ($case instanceof Status) {
// enumの利用
}
よくある落とし穴・注意
- 未定義で例外:
constant('NOPE')は例外。事前にdefined('NOPE')を使う。 - 完全修飾名必須:名前空間定数・クラス定数は FQCN で指定(
Foo\Bar::BAZ)。 - 性能:文字列解決+関数呼び出しコストがあるため、ループ多用は避け、必要なら一度取得して変数に保持。
- 定義との混同:
constant()は「取得専用」。定義はdefine()/const。 - PHP差分(参考):8.1+ で Enum ケース取得対応。古いコードの大文字小文字無視定数は非推奨・削除済み。
代替・関連APIとの比較
$foo::class/ClassName::CONST(直接参照):コンパイル時解決で速い。名前が動的に決まらないならこちら。defined():存在確認。未定義例外を避けるガードに必須。get_defined_constants():全定数の一覧。デバッグやホワイトリスト照合に。- 配列設定:大量マッピングは配列/Configの方が検索・テストしやすい。
テスト例(Pest)
<?php
use App\Config;
use App\Status;
it('gets value from constant name', function () {
define('APP_NAME', 'MyApp');
expect(constant('APP_NAME'))->toBe('MyApp');
});
it('gets class const and enum case', function () {
expect(constant(Config::class.'::RETRIES'))->toBe(3);
$case = constant(Status::class.'::OPEN');
expect($case)->toBeInstanceOf(Status::class);
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
Error: Undefined constant 'X' | 未定義名を指定 | defined('X') で事前チェック/名前のタイポ修正 |
Error: Class "Foo\Bar" not found | FQCNの解決失敗 | use の見直し/完全修飾名で指定 |
| 期待値と型が違う | Enum ケースを取得している | instanceof UnitEnum で確認し、必要なら $case->name/$case->value を使用 |

