constant — 定数名から値を動的取得する関数

PHP
  • カテゴリ: 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
  • 引数(表)
引数必須既定値説明
$namestringなし取得する定数の完全修飾名。例: '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 foundFQCNの解決失敗use の見直し/完全修飾名で指定
期待値と型が違うEnum ケースを取得しているinstanceof UnitEnum で確認し、必要なら $case->name$case->value を使用

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする