[解決済み】PHP|define() vs. const.
質問
PHPでは、2つの方法で定数を宣言することができます。
-
と
define
キーワードdefine('FOO', 1);
-
使用方法
const
キーワードconst FOO = 1;
- その2つの主な違いは何ですか?
- どのような場合に一方を使用し、どのような場合に他方を使用するのか、またその理由は?
どのように解決するのですか?
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 }
ところで、なぜそんなことをしたいのでしょうか?よくある用途としては、定数がすでに定義されているかどうかをチェックすることです。
if (!defined('FOO')) { define('FOO', 'BAR'); }
-
const
は、静的なスカラー(数値、文字列、その他の定数、例えばtrue
,false
,null
,__FILE__
) であるのに対しdefine()
は任意の式を取ります。PHP 5.6 以降では、定数式は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
は常に大文字と小文字が区別されますが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
}
概要
何らかの条件や表現による定義が必要でない限りは
const
の代わりに
define()
読みやすくするためです。
関連
-
[解決済み] 警告:mysqli_fetch_array()は、パラメータ1がmysqli_resultであることを期待する、オブジェクトはで指定された。
-
[解決済み] mysql_field_nameを新しいmysqliに変更します。
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] "お知らせ 未定義変数"、"Notice: Notice: 未定義のインデックス", "Notice:未定義のインデックス", "Notice."。PHPを使用した「未定義のオフセット
-
[解決済み] PHPでパスワードをハッシュ化するためにbcryptを使用するにはどうすればよいですか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み】PHPパスワードのハッシュとソルトの安全性について
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み】接続の取得に失敗しました: php_network_getaddresses: getaddrinfo failed: 名前またはサービスが不明
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み] コマンドの同期がとれていない。
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】警告:mysql_fetch_array()はパラメータ1がリソースであることを期待、ブール値は[重複]で与えられる]
-
[解決済み] Uncaught SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。
-
[解決済み] SSLエラー SSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました。
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?