【PHP8.x】define関数の使い方

作成日: 更新日:

define関数は、実行時に新しい名前付き定数を定義する関数です。この関数を使用することで、スクリプト全体で利用できる、値が変更されることのない固定のデータを設定できます。

定数を定義するには、まず定数名を表す文字列と、その定数に割り当てる値を指定します。一度定義された定数は、そのスクリプトが実行されている間、どこからでもアクセスでき、その値は決して変更されません。これは、プログラム内で頻繁に使用する設定値や、アプリケーションの動作に不可欠な固定値を管理する際に非常に有用です。例えば、データベースの接続情報や、アプリケーションのバージョン番号、ファイルパスといった情報を定数として定義することが一般的です。

定数名は通常、大文字で記述する慣習があり、変数とは異なり、名前の前に$記号はつけません。define関数で定数を定義すると、それ以降、同じ名前で別の値を定義しようとするとエラーとなりますので注意が必要です。この関数の利用により、プログラムの可読性が向上し、誤って重要な値が書き換えられるのを防ぐことができます。

基本的な使い方

構文(syntax)

define('MY_CONSTANT', 'Hello, PHP!');

引数(parameters)

string $constant_name, mixed $value, bool $case_insensitive = false

  • string $constant_name: 定数名を指定する文字列
  • mixed $value: 定数に代入する値を指定する
  • bool $case_insensitive = false: 定数名の比較を大文字小文字を区別しない場合は true を指定する

戻り値(return)

bool

define関数は、定数を定義するために使用されます。成功した場合はTRUEを、失敗した場合はFALSEを返します。

サンプルコード

PHPの「define」と「const」の違いを理解する

<?php

/**
 * PHPの定数定義「define」と「const」の違いを実演するサンプルコード。
 *
 * システムエンジニアを目指す初心者向けに、それぞれの特性を理解しやすく示します。
 */

// constはコンパイル時に処理されるため、トップレベル(グローバルスコープ)
// またはクラス定数としてのみ定義可能です。
const MY_GLOBAL_CONST = "これは 'const' で定義されたグローバル定数です。";

class MyConstants
{
    // クラス内でも 'const' を使って定数を定義できます。
    const MY_CLASS_CONST = "これは 'const' で定義されたクラス定数です。";
}

// defineは実行時に処理されるため、関数や条件分岐の内部でも定義可能です。
define("MY_DEFINED_GLOBAL_CONST", "これは 'define' で定義されたグローバル定数です。");

// defineの第3引数をtrueにすると、大文字・小文字を区別しない定数を定義できます。
// (現代のPHPコーディングでは非推奨です)
define("CASE_INSENSITIVE_EXAMPLE", "私は大文字・小文字を区別しません!", true);

function demonstrateConstantDifferences(): void
{
    echo "--- 定数の値のアクセス例 ---\n";
    echo "MY_GLOBAL_CONST: " . MY_GLOBAL_CONST . "\n";
    echo "MY_DEFINED_GLOBAL_CONST: " . MY_DEFINED_GLOBAL_CONST . "\n";
    echo "MY_CLASS_CONST: " . MyConstants::MY_CLASS_CONST . "\n\n";

    echo "--- 'define' と 'const' のスコープの違い ---\n";

    // constは関数内で直接定義できません。
    // (例: const INSIDE_FUNC_CONST = "エラー"; // これは構文エラーになります)
    echo "'const' は関数内で直接定義できません(コンパイルエラーとなります)。\n";

    // defineは関数内や条件分岐内で定義できます。
    if (true) {
        define("DEFINED_INSIDE_FUNCTION", "これは関数内で 'define' されました。");
    }
    echo "DEFINED_INSIDE_FUNCTION: " . (defined("DEFINED_INSIDE_FUNCTION") ? DEFINED_INSIDE_FUNCTION : "未定義") . "\n\n";

    echo "--- 'define' のケースインセンシティブオプション ---\n";
    echo "CASE_INSENSITIVE_EXAMPLE (元): " . CASE_INSENSITIVE_EXAMPLE . "\n";
    // defineの第3引数trueにより、小文字でアクセス可能です。
    echo "case_insensitive_example (小文字): " . case_insensitive_example . "\n\n";

    echo "--- 定数の再定義について ---\n";
    echo "定数は一度定義されると再定義できません。\n";
    echo "再定義を試みると警告(define)またはパースエラー(const)が発生します。\n";
    // 例: define("MY_DEFINED_GLOBAL_CONST", "新しい値"); // Warning: Constant MY_DEFINED_GLOBAL_CONST already defined
    // 例: const MY_GLOBAL_CONST = "新しい値"; // Parse error: Cannot redeclare constant MY_GLOBAL_CONST
    echo "再定義のコードは意図的にコメントアウトしています。\n";
}

// 定数の違いを示す関数を実行
demonstrateConstantDifferences();

?>

PHPのdefine関数は、プログラムの実行中に新しい定数を定義するために利用されます。第一引数$constant_nameには定義したい定数の名前を文字列で指定し、第二引数$valueには定数に割り当てる値を指定します。この値はどのような型でも構いません。第三引数$case_insensitiveはオプションで、trueを設定すると定数を参照する際に大文字・小文字を区別しなくなりますが、現代のPHPコーディングでは非推奨とされています。定数の定義に成功するとtrueが、失敗するとfalseが戻り値として返されます。

defineconstはどちらも定数を定義しますが、主な違いがあります。constはPHPコードが実行される前に処理(コンパイル時)されるため、ファイルのトップレベルやクラス内でしか定義できません。一方、defineはプログラムの実行中に処理されるため、関数の中や条件分岐のブロック内など、より柔軟な場所で定数を定義することが可能です。一度定義された定数は、defineでもconstでも再定義することはできません。再定義を試みるとエラーが発生しますので注意が必要です。これらの特性を理解することで、状況に応じて適切な定数定義方法を選択できるようになります。

constはコンパイル時に、defineは実行時に定数を定義します。この違いから、constはトップレベルやクラス内でしか使えず、defineは関数や条件分岐の内部でも定義できます。ただし、動的な定数定義はコードを複雑にする場合があるため、極力避けるべきです。defineの第三引数によるケースインセンシティブな定数定義は、現代のPHPでは非推奨ですので、使用しないようにしてください。定数は一度定義すると再定義できませんので、名前の衝突に注意が必要です。定数名は大文字スネークケースで統一すると、他の変数と区別しやすく、コードの可読性が向上します。

PHP define関数とdefined関数で定数を操作する

<?php

// define 関数は、スクリプトの実行中に定数を定義するために使用します。
// 定数は一度定義されると、その値を変更したり、再定義したりすることはできません。
// 一般的に、定数名はすべて大文字で記述し、単語間はアンダースコアで区切るのが推奨される慣習です。

// 1. 基本的な定数の定義
// define('定数名', 値);
// この例では、アプリケーションのバージョンを表す定数 'APP_VERSION' を定義しています。
// define関数は、定義が成功した場合に true を、失敗した場合に false を返しますが、
// 通常は成功すると想定して戻り値は確認しません。
define('APP_VERSION', '1.0.0');

// 2. defined 関数を使用して定数が定義されているかを確認します。
// defined('定数名') は、指定された定数が存在すれば true を、そうでなければ false を返します。
// これにより、定数を使用する前にその存在を確認できます。
if (defined('APP_VERSION')) {
    echo '定数 APP_VERSION は定義されています。値: ' . APP_VERSION . PHP_EOL;
} else {
    echo '定数 APP_VERSION は定義されていません。' . PHP_EOL;
}

// 3. 存在しない定数をチェックする例
// 'NON_EXISTENT_CONSTANT' という定数は定義されていないため、defined は false を返します。
if (defined('NON_EXISTENT_CONSTANT')) {
    echo '定数 NON_EXISTENT_CONSTANT は定義されています。' . PHP_EOL;
} else {
    echo '定数 NON_EXISTENT_CONSTANT は定義されていません。' . PHP_EOL;
}

// 4. 異なる型の定数を定義する例
// 数値や真偽値も定数として定義できます。
define('MAX_PROCESSES', 10);
define('IS_DEBUG_MODE', true);

if (defined('MAX_PROCESSES')) {
    echo '定数 MAX_PROCESSES は定義されています。値: ' . MAX_PROCESSES . PHP_EOL;
}

if (defined('IS_DEBUG_MODE')) {
    // 真偽値を出力する際は、可読性のため三項演算子などを使うと良いでしょう。
    echo '定数 IS_DEBUG_MODE は定義されています。値: ' . (IS_DEBUG_MODE ? 'true' : 'false') . PHP_EOL;
}

// 補足: define関数の第3引数 ($case_insensitive) について
// PHP 8.x (今回のバージョン 8.4.12 を含む) では、define 関数の第3引数 `bool $case_insensitive` は非推奨です。
// 定数名は大文字・小文字を区別して扱われるのが標準的な動作であり、推奨されるスタイルです。
// そのため、通常はこの引数を指定しない (デフォルトの false を使用する) ことが推奨されます。
// define('MY_CONSTANT', 'value', true); // このような使い方は避けるべきです。
// 定数名を常に大文字で記述することで、大文字・小文字の問題を回避できます。

?>

PHPのdefine関数は、スクリプトの実行中に値を変更できない「定数」を定義するために使われます。定数は一度定義されると、その値はスクリプトの最後まで固定され、再定義することもできません。定数名はすべて大文字で記述し、単語間をアンダースコアで区切るのが一般的な慣習です。この関数は、第一引数に定義したい定数名(文字列)を、第二引数にその値(任意の型)を受け取ります。戻り値は真偽値で、定義が成功すればtrue、失敗すればfalseですが、通常は成功を想定し確認しません。

一方、defined関数は、指定した定数がすでに定義されているかを確認するために利用します。これにより、定数を使用する前にその存在を安全にチェックできます。この関数は、第一引数に確認したい定数名(文字列)を受け取り、存在すればtrue、存在しなければfalseを返します。

サンプルコードでは、APP_VERSIONという定数をdefine関数で定義し、defined関数でその存在を確認しています。また、存在しない定数の確認や、数値や真偽値なども定数として定義できる例も示しています。

なお、define関数の第三引数で大文字・小文字を区別しない設定が可能でしたが、PHP 8.xでは非推奨です。定数名は大文字・小文字を区別して扱うのが標準のため、常に大文字で命名することをおすすめします。

define関数で定義した定数は、一度設定すると値を変更したり、再定義したりすることはできません。定数名はすべて大文字で記述し、単語間をアンダースコアで区切るのが推奨される慣習です。

defined関数を使うことで、定数が既に定義されているかを確認し、未定義の定数にアクセスするエラーを防ぐことができます。これはコードを安全に保つ上で重要なポイントです。

define関数の第3引数である大文字・小文字を区別しない設定(case_insensitive)は、PHP 8.x以降では非推奨です。この引数は使用せず、常に定数名を大文字で統一して記述することが、安全で標準的な利用方法となります。

PHP define関数で定数を定義して使う

<?php

/**
 * PHPのdefine関数を使用して定数を定義し、その使い方を示すサンプルコードです。
 * define関数は、スクリプトの実行中に新しい定数を定義するために使用されます。
 * 定義された定数は、スクリプトのどこからでもアクセス可能です。
 */

// 1. 基本的な定数の定義
// 定数名 'APP_NAME' に文字列 'My Awesome App' を定義します。
// デフォルトでは大文字・小文字を区別します。
define('APP_NAME', 'My Awesome App');

// 2. 数値型の定数の定義
// 定数名 'MAX_USERS' に数値 100 を定義します。
define('MAX_USERS', 100);

// 3. 論理値型の定数の定義
// 定数名 'DEBUG_MODE' に論理値 true を定義します。
define('DEBUG_MODE', true);

// 4. 大文字・小文字を区別しない定数の定義 (PHP 7.3以降では非推奨、PHP 8.0以降では廃止予定/非推奨警告)
// この機能は将来のPHPバージョンで削除される可能性があるため、通常は使用を避けるべきです。
// 定数名 'VERSION' に文字列 '1.0.0' を定義します。
// 第3引数に true を指定することで、大文字・小文字を区別せずアクセスできるようになります。
// define('VERSION', '1.0.0', true); // PHP 8.4では非推奨の警告が出ます。

// 定義された定数にアクセスして出力
echo "アプリケーション名: " . APP_NAME . PHP_EOL; // "My Awesome App"
echo "最大ユーザー数: " . MAX_USERS . PHP_EOL;   // "100"

if (DEBUG_MODE) {
    echo "デバッグモードが有効です。" . PHP_EOL;
} else {
    echo "デバッグモードが無効です。" . PHP_EOL;
}

// PHP 8.0以降では、大文字小文字を区別しない定数はE_DEPRECATED警告を発します。
// 以下の行をコメントアウト解除すると、バージョンによっては警告が表示される可能性があります。
/*
if (defined('VERSION')) {
    echo "バージョン (大文字・小文字を区別しない): " . version . PHP_EOL; // VERSIONとversionの両方でアクセス可能
}
*/

// 未定義の定数にアクセスしようとするとエラーが発生します (Fatal errorまたはWarning)。
// echo UNDEFINED_CONSTANT;

?>

define関数は、PHPスクリプトの実行中に新しい定数を定義するために使用されます。定数とは、一度値を設定するとプログラムの途中で変更できない名前付きのデータのことで、グローバルにアクセス可能です。この関数は3つの引数を取ります。最初の$constant_nameには、定義したい定数の名前を文字列で指定します。例えばAPP_NAMEのように大文字で記述するのが一般的です。次に$valueには、その定数に割り当てる値を指定します。文字列、数値、論理値など、様々な型の値を設定できます。3番目の$case_insensitiveはオプション引数で、定数名を大文字・小文字を区別せずに扱いたい場合にtrueを指定します。ただし、この機能はPHP 7.3以降非推奨となり、PHP 8.0以降では非推奨の警告が発生するため、通常は使用を避けるべきです。関数は定数の定義に成功した場合はtrueを、失敗した場合はfalseを戻り値として返します。サンプルコードでは、アプリケーション名や最大ユーザー数、デバッグモードといった定数を定義し、それらの値にアクセスして出力する基本的な使い方を示しています。これにより、プログラム全体で共通の固定値を一貫して管理し、コードの可読性を高めることができます。

PHPのdefine関数は、スクリプト実行中に新しい定数を定義するために使われます。定数名は大文字で記述することが一般的で、文字列、数値、論理値など多様な値を設定可能です。定義された定数には、その名前を直接記述してアクセスできます。特に重要な注意点として、PHP 8.4では第三引数にtrueを指定して大文字・小文字を区別しない定数を定義する方法は非推奨です。この機能は将来的に廃止される可能性があるため、使用は避けてください。一度定義した定数を再定義することはできません。また、未定義の定数にアクセスするとエラーが発生しますのでご注意ください。

PHP defineで配列を定数化する

<?php

/**
 * 定数として配列を定義し、その内容を表示するサンプルコード。
 *
 * `define()` 関数は、名前付きの定数を定義するために使用されます。
 * 第二引数に配列を渡すことで、配列を定数として定義できます。
 */

// 'FRUIT_LIST' という名前の定数として配列を定義します。
// 定数は一度定義されると、プログラムの実行中に変更することはできません。
define('FRUIT_LIST', [
    'Apple',
    'Banana',
    'Cherry',
    'Date',
]);

// 定数が正しく定義されたか確認し、その内容を出力します。
if (defined('FRUIT_LIST')) {
    echo "FRUIT_LIST 定数の内容:\n";
    // 配列の定数の内容を人間が読みやすい形式で出力します。
    print_r(FRUIT_LIST);

    echo "\nFRUIT_LIST の最初の要素: " . FRUIT_LIST[0] . "\n";
    echo "FRUIT_LIST の最後の要素: " . FRUIT_LIST[3] . "\n";
} else {
    echo "FRUIT_LIST 定数の定義に失敗しました。\n";
}

// キーと値のペアを持つ連想配列も定数として定義できます。
define('USER_INFO', [
    'name'  => 'John Doe',
    'age'   => 30,
    'email' => 'john.doe@example.com',
]);

echo "\nUSER_INFO 定数の内容:\n";
print_r(USER_INFO);
echo "\nUSER_INFO の名前: " . USER_INFO['name'] . "\n";

?>

PHPのdefine()関数は、プログラムの実行中に値が変わらない「定数」を定義するために使用されます。定数は、設定値や固定のリストなど、プログラム全体で共通して使用する値を管理するのに便利です。

この関数は、第一引数に定義したい定数の名前を文字列で、第二引数に定数として設定したい値(任意の型)を指定します。第三引数はオプションで、定数名の大文字・小文字を区別するかどうかを設定しますが、通常はデフォルトのfalseを使用します。関数が定数の定義に成功するとtrueを、失敗するとfalseを戻り値として返します。

サンプルコードでは、define()関数を使って配列を定数として定義する方法を示しています。FRUIT_LISTは果物のリストを格納した数値添字配列として、USER_INFOはユーザー情報を持つ連想配列として定義されました。定数として定義された配列は、FRUIT_LIST[0]USER_INFO['name']のように、変数名に$を付けずに直接その名前でアクセスできます。print_r()関数は、配列の内容を人間が読みやすい形式で出力するために利用されます。定数は一度定義されると値を変更できないため、プログラムの誤操作を防ぎ、コードの信頼性を高める役割も果たします。

PHP 7.0以降では、define関数を使って配列を定数として定義できます。一度定義した定数は、プログラム実行中に値を変更したり再定義したりすることはできませんのでご注意ください。定数名は慣例として全て大文字のスネークケースで記述することで、他の変数と区別しやすくなり、視認性が高まります。

定数を利用する際は、defined()関数で定数の存在を確認すると、未定義エラーを防ぎ、より堅牢なコードになります。定義した配列定数の要素にはFRUIT_LIST[0]のように直接アクセス可能です。define関数は、グローバルスコープでアプリケーション全体からアクセスできる定数を設定したい場合に特に適しています。

【PHP8.x】define関数の使い方 | いっしー@Webエンジニア