PHP | define() と const の違い 質問する

PHP | define() と const の違い 質問する

PHP では、次の 2 つの方法で定数を宣言できます。

  1. defineキーワード付き

    define('FOO', 1);
    
  2. 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は静的スカラー (数値、文字列、またはtruefalsenullなどの他の定数__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()

おすすめ記事