PHP では、次の 2 つの方法で定数を宣言できます。
define
キーワード付きdefine('FOO', 1);
const
キーワードの使用const FOO = 1;
- これら 2 つの主な違いは何ですか?
- いつ、なぜ一方を使用し、他方を使用するべきなのでしょうか?
ベストアンサー1
PHP 5.3では2つの方法があります定数を定義する:const
キーワードを使用するか、define()
関数:
const FOO = 'BAR';
define('FOO', 'BAR');
これら 2 つの方法の基本的な違いは、 はconst
定数をコンパイル時に定義するのに対し、 はdefine
定数を実行時に定義することです。これがconst
のほとんどの欠点の原因です。 の欠点には次のようなものconst
があります。
const
条件付きで定数を定義するために使用することはできません。グローバル定数を定義するには、最も外側のスコープで使用する必要があります。if (...) { const FOO = 'BAR'; // Invalid } // but if (...) { define('FOO', 'BAR'); // Valid }
そもそもなぜそんなことをしたいのでしょうか? よくある用途の 1 つは、定数がすでに定義されているかどうかを確認することです。
if (!defined('FOO')) { define('FOO', 'BAR'); }
const
は静的スカラー (数値、文字列、またはtrue
、false
、null
などの他の定数__FILE__
) を受け入れますが、 は任意の式を受け入れます。PHP 5.6 以降では定数式もdefine()
許可されます。const
const BIT_5 = 1 << 5; // Valid since PHP 5.6 and invalid previously define('BIT_5', 1 << 5); // Always valid
const
は単純な定数名を受け取りますが、define()
任意の式を名前として受け入れます。これにより、次のようなことが可能になります。for ($i = 0; $i < 32; ++$i) { define('BIT_' . $i, 1 << $i); }
const
は常に大文字と小文字を区別しますが、 を3 番目の引数としてdefine()
渡すことで大文字と小文字を区別しない定数を定義できますtrue
(注: 大文字と小文字を区別しない定数の定義は PHP 7.3.0 以降では非推奨であり、PHP 8.0.0 以降では削除されています)。define('FOO', 'BAR', true); echo FOO; // BAR echo foo; // BAR
const
以上が、悪い面です。では、私が個人的に、上記のいずれかの状況が発生しない限り、常に を使用する理由を見てみましょう。
const
単純に読みやすくなります。これは関数ではなく言語構造であり、クラスで定数を定義する方法とも一致しています。const
は言語構造であるため、自動化ツールによって静的に分析できます。const
現在の名前空間で定数を定義しますが、define()
完全な名前空間名を渡す必要があります。namespace A\B\C; // To define the constant A\B\C\FOO: const FOO = 'BAR'; define('A\B\C\FOO', 'BAR');
PHP 5.6 以降では
const
定数も配列になることができますが、define()
配列はまだサポートされていません。ただし、PHP 7 ではどちらの場合も配列がサポートされる予定です。const FOO = [1, 2, 3]; // Valid in PHP 5.6 define('FOO', [1, 2, 3]); // Invalid in PHP 5.6 and valid in PHP 7.0
最後に、const
クラスやインターフェース内では、クラス定数またはインターフェース定数。define
この目的には使用できません:
class Foo {
const BAR = 2; // Valid
}
// But
class Baz {
define('QUX', 2); // Invalid
}
まとめ
何らかの条件付き定義または式による定義が必要でない限り、読みやすさのためだけに、 sconst
の代わりに s を使用してください。define()