1. ホーム
  2. php

[解決済み】PHP|define() vs. const.

2022-04-28 18:18:22

質問

PHPでは、2つの方法で定数を宣言することができます。

  1. define キーワード

    define('FOO', 1);
    
    
  2. 使用方法 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() 読みやすくするためです。