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

作成日: 更新日:

function_exists関数は、指定された関数が定義されているかどうかをチェックする関数です。引数として関数名を文字列で受け取り、その関数が存在する場合はtrue、存在しない場合はfalseを返します。この関数は、特に動的に関数を呼び出す場合や、特定の拡張モジュールがインストールされているかどうかによって処理を分岐させたい場合に役立ちます。例えば、ある関数が特定のPHPバージョンや拡張モジュールでのみ利用可能な場合に、function_existsを使って事前に存在を確認することで、エラーを回避し、より柔軟なコードを書くことができます。

具体的には、function_exists('gzcompress')のように記述することで、gzcompress関数が存在するかどうかを確認できます。gzcompress関数はzlib拡張モジュールに含まれているため、この関数が存在するかどうかを調べることで、zlib拡張モジュールが有効になっているかどうかを判断できます。存在しない関数名を指定した場合、function_existsfalseを返します。

function_existsは、ユーザー定義関数だけでなく、PHPの組み込み関数や拡張モジュールで提供される関数についてもチェックできます。しかし、抽象メソッドやトレイトのメソッドの存在チェックには適していません。あくまでグローバルスコープで定義された関数(または定義されようとしている関数)の存在を確認するための関数として利用されます。また、名前空間付きの関数もチェック可能です。その場合は、function_exists('MyNamespace\myFunction')のように完全修飾名で指定する必要があります。

基本的な使い方

構文(syntax)

function function_exists ( string $function_name ) : bool

引数(parameters)

string $function

  • string $function: 存在を確認したい関数の名前を指定する文字列

戻り値(return)

bool

指定された名前の関数が存在するかどうかを示す真偽値(trueまたはfalse)を返します。

サンプルコード

PHP function_exists で関数存在を確認する

<?php

/**
 * function_exists 関数の使用例
 * 指定された関数が存在するかどうかを確認します。
 */

// 組み込み関数が存在するか確認
if (function_exists('array_push')) {
    echo "array_push 関数は存在します。\n";
} else {
    echo "array_push 関数は存在しません。\n";
}

// ユーザー定義関数が存在するか確認
function my_custom_function() {
    echo "これはカスタム関数です。\n";
}

if (function_exists('my_custom_function')) {
    echo "my_custom_function 関数は存在します。\n";
    my_custom_function(); // 関数を実行
} else {
    echo "my_custom_function 関数は存在しません。\n";
}

// 存在しない関数を確認
if (function_exists('non_existent_function')) {
    echo "non_existent_function 関数は存在します。\n";
} else {
    echo "non_existent_function 関数は存在しません。\n";
}

?>

PHPのfunction_exists関数は、指定された名前の関数が定義されているかどうかを調べるために使用します。引数には、確認したい関数名を文字列で渡します。この関数は、組み込み関数とユーザー定義関数の両方を確認できます。

サンプルコードでは、まずarray_pushという組み込み関数が存在するかどうかをfunction_exists関数で確認しています。array_pushはPHPに標準で備わっている関数なので、存在する場合は「array_push 関数は存在します。」というメッセージが表示されます。

次に、my_custom_functionというユーザー定義関数を定義し、同様にfunction_exists関数でその存在を確認しています。関数が存在する場合は、「my_custom_function 関数は存在します。」というメッセージが表示され、その後、実際にmy_custom_function関数が実行されます。

最後に、non_existent_functionという存在しない関数をfunction_exists関数で確認しています。この関数は定義されていないため、「non_existent_function 関数は存在しません。」というメッセージが表示されます。

function_exists関数は、関数が存在するかどうかを示す真偽値(trueまたはfalse)を返します。関数の存在を確認することで、存在しない関数を呼び出してエラーが発生するのを防ぎ、プログラムの安定性を高めることができます。関数の有無によって処理を分岐させたい場合に役立ちます。

function_exists関数は、指定された関数が定義済みかどうかをチェックします。引数には関数名を文字列で渡します。組み込み関数だけでなく、自分で定義した関数も確認できます。

注意点として、関数名は文字列で指定する必要があることです。また、大文字小文字は区別されません。function_exists('My_Custom_Function')のように記述しても、my_custom_functionが存在すればtrueを返します。

関数が定義されているか確認してから実行することで、存在しない関数を呼び出すエラーを回避できます。特に、外部ライブラリやプラグインを利用する際に、必要な関数がロードされているか確認する用途で役立ちます。

PHP function_exists でグローバル関数をチェックする

<?php

/**
 * テスト用のグローバル関数を定義します。
 * function_exists がこの関数の存在をチェックするために使用されます。
 */
function myTestGlobalFunction(): string
{
    return "これは 'myTestGlobalFunction' です。";
}

/**
 * グローバル関数が存在するかどうかをオブジェクトのコンテキスト内でチェックするクラスです。
 *
 * function_exists 関数は、PHPのグローバルな関数(スクリプトのどこからでも呼び出せる関数)が
 * 定義されているかどうかを確認するために使用されます。
 * クラスのメソッドやオブジェクトのメソッドの存在をチェックするものではありません。
 */
class GlobalFunctionChecker
{
    /**
     * このメソッド内で function_exists を使用して、グローバル関数の存在をチェックします。
     * これは、オブジェクトの内部からグローバルな状態(この場合はグローバル関数の存在)
     * を確認する例を示しています。
     */
    public function checkFunctions(): void
    {
        echo "--- グローバル関数の存在チェック ---\n";

        // 存在するグローバル関数をチェックする例
        if (function_exists('myTestGlobalFunction')) {
            echo "  'myTestGlobalFunction' は存在します。\n";
            echo "  呼び出し結果: " . myTestGlobalFunction() . "\n";
        } else {
            echo "  'myTestGlobalFunction' は存在しません。\n";
        }

        echo "\n";

        // 存在しないグローバル関数をチェックする例
        if (function_exists('nonExistentFunction')) {
            echo "  'nonExistentFunction' は存在します。\n";
        } else {
            echo "  'nonExistentFunction' は存在しません。\n";
        }

        echo "\n";

        echo "--- 注意: function_exists はクラスのメソッドをチェックしません ---\n";
        // 重要: function_exists はクラスのメソッドの存在はチェックしません。
        // クラスのメソッドの存在を確認するには method_exists 関数を使用します。
        // そのため、以下のチェックは常に false を返します。
        if (function_exists('GlobalFunctionChecker::checkFunctions')) {
            echo "  'GlobalFunctionChecker::checkFunctions' が存在すると誤って判断されました (function_exists の誤用)。\n";
        } else {
            echo "  'GlobalFunctionChecker::checkFunctions' は存在しません (これは正しい結果です)。\n";
        }
    }
}

// GlobalFunctionChecker クラスのインスタンス(オブジェクト)を作成します。
$checker = new GlobalFunctionChecker();

// オブジェクトのメソッドを呼び出し、グローバル関数の存在をチェックします。
// これにより、「オブジェクト内」から function_exists が実行される例となります。
$checker->checkFunctions();

?>

このサンプルコードは、PHPのfunction_exists関数を使って、グローバル関数が存在するかどうかをオブジェクトのコンテキスト内で確認する方法を示しています。function_exists関数は、引数に指定された名前の関数が定義済みかどうかを調べ、真偽値(true/false)を返します。

最初に、myTestGlobalFunctionというグローバル関数を定義しています。これは、function_existsで存在を確認するための関数です。

次に、GlobalFunctionCheckerというクラスを定義し、その中にcheckFunctionsというメソッドを作成しています。このメソッド内でfunction_existsを使い、myTestGlobalFunctionnonExistentFunctionという存在しない関数の存在をチェックしています。存在すればメッセージを表示し、関数を呼び出します。存在しなければ、存在しない旨を表示します。

重要な点として、function_existsはクラスのメソッドの存在は確認できません。GlobalFunctionChecker::checkFunctionsのようにクラス名とメソッド名を指定しても、常にfalseを返します。クラスのメソッドの存在を確認するには、method_exists関数を使用する必要があります。

最後に、GlobalFunctionCheckerクラスのインスタンスを作成し、checkFunctionsメソッドを呼び出しています。これにより、オブジェクトの内部からグローバルな関数の存在を確認する例を示しています。

function_exists()は、グローバルに定義された関数が存在するかどうかを確認する関数です。クラスのメソッドやオブジェクトのメソッドの存在確認には使用できません。メソッドの存在確認にはmethod_exists()を使用してください。function_exists()にクラスのメソッド名を渡しても常にfalseが返ります。引数には、確認したい関数の名前を文字列で渡します。関数名のスペルミスに注意してください。大文字小文字も区別されます。関数が存在しない場合でも、エラーは発生しません。安全に利用するため、関数が存在しない場合の処理も記述することを推奨します。

PHP function_existsと名前空間の挙動

<?php

// --- グローバル名前空間の定義 ---

/**
 * グローバル名前空間に定義されたサンプル関数です。
 * function_exists 関数による存在チェックの対象となります。
 */
function globalSampleFunction(): void
{
    // この関数はデモ内で呼び出されません。
}

// --- MyProject 名前空間の定義 ---

namespace MyProject; // ここから MyProject 名前空間に入ります

/**
 * MyProject 名前空間内に定義されたサンプル関数です。
 * function_exists 関数による存在チェックの対象となります。
 */
function namespacedSampleFunction(): void
{
    // この関数はデモ内で呼び出されません。
}

/**
 * PHPの function_exists 関数と名前空間の挙動を示すデモンストレーション関数です。
 * システムエンジニアを目指す初心者向けに、関数の存在チェック方法と
 * 名前空間がそれにどう影響するかを解説します。
 */
function demonstrateFunctionExists(): void
{
    echo "--- function_exists と名前空間のデモ ---\n\n";

    // 1. グローバル名前空間の関数の存在チェック
    // 名前空間内にいても、グローバル関数は直接名前でチェックできます。
    if (function_exists('globalSampleFunction')) {
        echo "1. 'globalSampleFunction' (グローバル空間) は存在します。\n\n";
    } else {
        echo "1. 'globalSampleFunction' (グローバル空間) は存在しません。\n\n";
    }

    // 2. PHP組み込み関数の存在チェック (常にグローバル名前空間に存在します)
    if (function_exists('array_map')) {
        echo "2. 'array_map' (組み込み関数) は存在します。\n\n";
    } else {
        echo "2. 'array_map' (組み込み関数) は存在しません。\n\n";
    }

    // 3. 現在の名前空間 (MyProject) 内の関数の存在チェック
    // 名前空間内の関数を正確にチェックするには、完全修飾名 (FQCN) を使用する必要があります。
    // __NAMESPACE__ 定数は現在の名前空間名を返します。
    $fullyQualifiedName = __NAMESPACE__ . '\\namespacedSampleFunction';
    if (function_exists($fullyQualifiedName)) {
        echo "3. '{$fullyQualifiedName}' (名前空間内) は存在します。\n\n";
    } else {
        echo "3. '{$fullyQualifiedName}' (名前空間内) は存在しません。\n\n";
    }

    // 4. 不完全な名前で名前空間内の関数をチェックした場合
    // function_exists('namespacedSampleFunction') は、現在の名前空間内ではなく、
    // グローバル名前空間の 'namespacedSampleFunction' を探します。
    echo "4. 'namespacedSampleFunction' (不完全な名前) でチェック:\n";
    if (function_exists('namespacedSampleFunction')) {
        echo "   存在します。(注: グローバル空間に同名の関数があればtrue、なければfalse)\n\n";
    } else {
        echo "   存在しません。(注: グローバル空間に同名の関数があればtrue、なければfalse)\n\n";
    }

    // 5. 存在しない関数のチェック
    if (function_exists('nonExistentFunction')) {
        echo "5. 'nonExistentFunction' は存在します。(このメッセージは通常表示されません)\n\n";
    } else {
        echo "5. 'nonExistentFunction' は存在しません。\n\n";
    }
}

// デモンストレーション関数を実行します。
// この関数は MyProject 名前空間内で定義されているため、
// MyProject\demonstrateFunctionExists として解決され実行されます。
demonstrateFunctionExists();

?>

function_exists関数は、引数に指定された関数名(文字列)がPHPで定義されているかを確認し、存在すればtrue、なければfalseを返します。

この関数は、PHPの名前空間と組み合わせる際、その挙動を理解しておくことが重要です。globalSampleFunctionのようなグローバル関数やarray_mapのような組み込み関数は、現在の名前空間に関わらず、関数名を直接指定して存在チェックが可能です。

一方、名前空間内で定義された関数をチェックする場合は注意が必要です。不完全な関数名で指定すると、function_existsはグローバル名前空間を探します。そのため、名前空間内の関数を正確にチェックするには、MyProject\namespacedSampleFunctionのように完全修飾名(FQCN)を引数に指定する必要があります。これにより、目的の関数が指定の名前空間内に確実に存在するかを判断できます。存在しない関数名を指定した場合はfalseが返されます。

function_exists関数は、指定した関数がPHPで利用できるかを確認しますが、名前空間の扱いに注意が必要です。この関数は、通常、グローバル名前空間に定義されている関数を探します。そのため、現在いる名前空間内の関数をチェックしたい場合は、__NAMESPACE__ . '\\関数名'のように、名前空間を含む完全な名前で指定する必要があります。一方で、グローバル名前空間に直接定義された関数や、array_mapのようなPHPの組み込み関数は、どこからでも直接名前で確認できます。関数の存在を事前にチェックすることで、未定義関数を呼び出すことによるエラーを防ぎ、プログラムをより安定して動作させることが可能です。

PHPの関数存在チェックと使用例

<?php

/**
 * 指定された関数が定義済みかどうかを確認する例.
 *
 * @return void
 */
function checkFunctionExists(): void
{
    $functionName = 'array_map';

    if (function_exists($functionName)) {
        echo "関数 '$functionName' は定義されています。\n";
    } else {
        echo "関数 '$functionName' は定義されていません。\n";
    }

    $undefinedFunctionName = 'undefined_function';

    if (function_exists($undefinedFunctionName)) {
        echo "関数 '$undefinedFunctionName' は定義されています。\n";
    } else {
        echo "関数 '$undefinedFunctionName' は定義されていません。\n";
    }
}

checkFunctionExists();

このPHPのサンプルコードは、function_exists関数を使って、指定された関数が定義済みかどうかをチェックする方法を示しています。function_exists関数は、引数として関数の名前(文字列)を受け取り、その関数が現在の環境で利用可能かどうかをboolean値(trueまたはfalse)で返します。

サンプルコードでは、まずcheckFunctionExistsという関数を定義しています。この関数内で、array_mapというPHPの組み込み関数と、undefined_functionという存在しない関数を例として取り上げ、function_exists関数を使ってそれぞれの存在を確認しています。

array_mapはPHPに標準で備わっている関数なので、function_exists('array_map')trueを返し、「関数 'array_map' は定義されています。」と出力されます。一方、undefined_functionは定義されていないため、function_exists('undefined_function')falseを返し、「関数 'undefined_function' は定義されていません。」と出力されます。

このコードを実行することで、function_exists関数が、関数名に対応する関数が定義されているかどうかを正しく判定できることがわかります。システムエンジニアを目指す上で、この関数は、外部ライブラリや拡張機能の利用可否を事前に確認し、エラーを未然に防ぐために役立ちます。例えば、特定の関数が存在する場合のみ、その関数を利用した処理を実行するように制御することができます。

function_exists() は、引数に指定した名前の関数が定義されているかどうかを調べます。この関数は、PHPに組み込みの関数だけでなく、自分で定義した関数や、include/require で読み込んだファイルで定義された関数もチェックできます。

初心者の方が注意すべき点として、関数名は文字列で指定する必要があるという点です。文字列を間違えると、意図しない結果になる可能性があります。また、関数名の大文字小文字は区別されません。

function_exists() は、関数の存在を確認するだけで、その関数が正常に動作することを保証するものではありません。関数が存在していても、必要な拡張モジュールがインストールされていなかったり、依存関係が満たされていないなどの理由で、エラーが発生する可能性があります。使用する前に、関連するドキュメントを確認することを推奨します。

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