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

作成日: 更新日:

method_exists関数は、指定されたオブジェクトまたはクラスに特定のメソッドが存在するかどうかを確認する関数です。この関数は、第一引数に対象となるオブジェクトのインスタンス、またはクラス名を文字列で受け取り、第二引数に確認したいメソッド名を文字列で受け取ります。指定されたメソッドが実際に存在する場合、この関数は真偽値のtrueを返し、存在しない場合はfalseを返します。

この関数は、プログラムの実行中に、あるオブジェクトが特定の機能(メソッド)を実行できるかを動的に判断したい場合に非常に有用です。例えば、外部から取得したオブジェクトや、様々なクラスのインスタンスを扱う際に、存在しないメソッドを呼び出してしまい予期せぬエラーが発生するのを未然に防ぐことができます。また、特定のオブジェクトが特定の振る舞いをサポートしているかをシンプルにチェックしたい場面でも活用されます。静的メソッドの存在確認にも対応しており、この機能を使うことで、より堅牢で予測可能なコードを書くことが可能になります。

基本的な使い方

構文(syntax)

<?php

class MyClass
{
    public function myMethod()
    {
        // このメソッドは存在する
    }

    public function anotherMethod()
    {
        // このメソッドも存在する
    }
}

$objectInstance = new MyClass();
$methodNameToCheck = 'myMethod';

// オブジェクトインスタンス ($objectInstance) に指定されたメソッド名 ($methodNameToCheck) が存在するか確認する
if (method_exists($objectInstance, $methodNameToCheck)) {
    // メソッドが存在する場合の処理
    echo "メソッド '{$methodNameToCheck}' は存在します。\n";
    $objectInstance->myMethod();
} else {
    // メソッドが存在しない場合の処理
    echo "メソッド '{$methodNameToCheck}' は存在しません。\n";
}

// クラス名(文字列)に対しても使用可能
// if (method_exists('MyClass', 'anotherMethod')) {
//     echo "クラス 'MyClass' に 'anotherMethod' は存在します。\n";
// }

?>

引数(parameters)

object|string $object_or_class, string $method

  • object|string $object_or_class: メソッドの存在を確認したいオブジェクトまたはクラス名
  • string $method: 確認したいメソッドの名前

戻り値(return)

bool

指定されたクラスに、指定された名前のメソッドが存在するかどうかを示します。メソッドが存在する場合はtrueを、存在しない場合はfalseを返します。

サンプルコード

method_existsのメソッド名大文字小文字区別を確認する

<?php

/**
 * method_exists関数の動作を確認するためのサンプルクラス。
 */
class ExampleClass
{
    /**
     * テスト用の公開メソッド。
     * このメソッドの存在を method_exists で確認します。
     */
    public function myMethod()
    {
        // このメソッドは呼び出しませんが、その存在を確認するために定義されています。
    }
}

// クラス名を文字列として指定
$className = 'ExampleClass';

echo "method_exists関数がメソッド名の大文字・小文字を区別するか (case sensitive) を確認します。\n\n";

// 1. 正しい大文字・小文字のメソッド名で確認
echo "メソッド名 'myMethod' の存在確認 (正しい大文字・小文字):\n";
var_dump(method_exists($className, 'myMethod')); // 結果: true (正しいメソッド名なので存在します)
echo "\n";

// 2. 全て小文字のメソッド名で確認
echo "メソッド名 'mymethod' (全て小文字) の存在確認:\n";
var_dump(method_exists($className, 'mymethod')); // 結果: false (method_existsは大文字・小文字を区別します)
echo "\n";

// 3. 全て大文字のメソッド名で確認
echo "メソッド名 'MYMETHOD' (全て大文字) の存在確認:\n";
var_dump(method_exists($className, 'MYMETHOD')); // 結果: false (method_existsは大文字・小文字を区別します)
echo "\n";

// 4. 先頭のみ大文字のメソッド名で確認
echo "メソッド名 'MyMethod' (先頭のみ大文字) の存在確認:\n";
var_dump(method_exists($className, 'MyMethod')); // 結果: false (method_existsは大文字・小文字を区別します)
echo "\n";

echo "PHPの method_exists 関数は、メソッド名の大文字・小文字を厳密に区別します。\n";
echo "そのため、メソッド名がわずかでも異なる場合、存在しないと判断されます。\n";

PHPのmethod_exists関数は、指定したクラスやオブジェクト内に特定のメソッドが存在するかどうかを安全に確認するために使用されます。この関数は、システム開発において、メソッドが予期せず存在しないことによるエラーを防ぐために有効な機能です。

第一引数には、メソッドを確認したい対象としてクラス名(文字列)またはオブジェクトそのものを指定します。第二引数には、確認したいメソッド名を文字列で渡します。関数が返す戻り値はブール値(bool)で、メソッドが存在すればtrueを、存在しなければfalseを返します。

特に重要な点として、method_exists関数はメソッド名の大文字・小文字を厳密に区別します(case sensitive)。例えば、ExampleClassというクラスにmyMethodという名前のメソッドが定義されている場合、method_exists('ExampleClass', 'myMethod')を実行するとtrueが返されます。しかし、メソッド名が'mymethod'(全て小文字)や'MYMETHOD'(全て大文字)、あるいは'MyMethod'(先頭のみ大文字)のように、わずかでも大文字・小文字が異なると、メソッドは存在しないと判断されfalseが返されます。

このため、method_existsを使用する際は、確認したいメソッド名の大文字・小文字を正確に指定する必要があります。

method_exists関数は、指定されたクラスまたはオブジェクトに、指定されたメソッドが存在するかどうかを確認します。この関数を使う上で最も重要な注意点は、メソッド名の大文字・小文字を厳密に区別するという点です。

サンプルコードが示すように、メソッド名がわずかでも大文字・小文字の点で異なると、メソッドは存在しないと判断されfalseが返されます。そのため、メソッドの存在を確認する際は、定義されているメソッド名と完全に一致する文字列を使用することが、誤動作を防ぎ、コードを安全かつ正確に利用するための重要な補足となります。常に正しいメソッド名を指定してください。

PHPでクラス内のメソッド存在チェック

<?php

/**
 * Demonstrates the use of method_exists() within a class context
 * to check for the presence of methods in the current class.
 *
 * This class includes various types of methods (public, protected, static)
 * to showcase how method_exists works with different access levels and types
 * when called from within the class itself, using $this and self::class.
 */
class MethodChecker
{
    // A public instance method
    public function publicInstanceMethod(): void
    {
        // This method exists.
    }

    // A protected instance method
    protected function protectedInstanceMethod(): void
    {
        // This method also exists.
    }

    // A public static method
    public static function staticMethod(): void
    {
        // This static method exists.
    }

    /**
     * Checks for the existence of various methods within this class.
     * Uses both $this (for instance methods) and self::class (for class/static methods).
     */
    public function demonstrateMethodExistsInCurrentClass(): void
    {
        echo "--- Checking method existence within " . self::class . " ---\n\n";

        // 1. Check for a public instance method using $this
        if (method_exists($this, 'publicInstanceMethod')) {
            echo "✅ 'publicInstanceMethod' exists on the current object (\$this).\n";
        } else {
            echo "❌ 'publicInstanceMethod' does not exist on the current object (\$this).\n";
        }

        // 2. Check for a protected instance method using $this
        // From within the class, method_exists can see protected/private methods.
        if (method_exists($this, 'protectedInstanceMethod')) {
            echo "✅ 'protectedInstanceMethod' exists on the current object (\$this).\n";
        } else {
            echo "❌ 'protectedInstanceMethod' does not exist on the current object (\$this).\n";
        }

        // 3. Check for a public static method using self::class
        if (method_exists(self::class, 'staticMethod')) {
            echo "✅ 'staticMethod' exists on " . self::class . ".\n";
        } else {
            echo "❌ 'staticMethod' does not exist on " . self::class . ".\n";
        }

        // 4. Check for a non-existent method using $this
        if (method_exists($this, 'nonExistentInstanceMethod')) {
            echo "❌ 'nonExistentInstanceMethod' unexpectedly exists on the current object (\$this).\n";
        } else {
            echo "✅ 'nonExistentInstanceMethod' correctly does not exist on the current object (\$this).\n";
        }

        // 5. Check for a non-existent method using self::class
        if (method_exists(self::class, 'nonExistentStaticMethod')) {
            echo "❌ 'nonExistentStaticMethod' unexpectedly exists on " . self::class . ".\n";
        } else {
            echo "✅ 'nonExistentStaticMethod' correctly does not exist on " . self::class . ".\n";
        }
    }
}

// To run the demonstration:
// 1. Create an instance of the MethodChecker class.
$checkerInstance = new MethodChecker();

// 2. Call the method that demonstrates method_exists within the current class.
$checkerInstance->demonstrateMethodExistsInCurrentClass();

method_exists関数は、指定されたオブジェクトまたはクラスに特定のメソッドが存在するかどうかを確認するために使用されます。この関数は、PHP 8.4.12で利用可能です。

最初の引数$object_or_classには、メソッドの存在を確認したいオブジェクトのインスタンス、またはクラス名を文字列で渡します。2番目の引数$methodには、確認したいメソッドの名前を文字列で指定します。メソッドが存在すればtrueを、存在しなければfalseをブール値で返します。

サンプルコードでは、MethodCheckerクラスが自身のクラスに定義されたメソッドの存在をmethod_existsでチェックしています。インスタンスメソッド(publicInstanceMethodprotectedInstanceMethod)の確認には$thisを使用し、静的メソッド(staticMethod)の確認にはクラス名を表すself::classを使用しています。クラス内部からmethod_existsを呼び出す場合、protectedメソッドも存在すると判定されます。存在しないメソッド名を指定した場合は、期待通りfalseが返されることが確認できます。これにより、メソッド呼び出し前の安全性確認に活用できます。

method_exists関数は、指定したオブジェクトやクラスに特定のメソッドが存在するかを真偽値で返します。第一引数には、オブジェクトのインスタンス($this)またはクラス名(self::class)を指定します。インスタンスの文脈では$thisを、静的な文脈ではクラス名を使うとコードの意図が明確になります。この関数は、クラスの内部から呼び出すことで、publicだけでなくprotectedprivateといった外部から直接アクセスできないメソッドの存在も正しく検知できます。ただし、__callというマジックメソッドがクラスに定義されている場合、物理的に存在しないメソッド名に対してもtrueを返すことがあるため注意が必要です。

PHP: method_exists で静的メソッドの存在を確認する

<?php

/**
 * method_exists() 関数の 'static' な使い方を示すサンプルクラス。
 * このクラスは、静的メソッドとインスタンスメソッドの両方を含みます。
 */
class MyUtilityClass
{
    /**
     * これは静的メソッドです。
     * オブジェクトのインスタンスを作成することなく、クラス名から直接呼び出すことができます。
     */
    public static function performStaticAction(string $message): string
    {
        return "静的メソッドが実行されました: " . strtoupper($message);
    }

    /**
     * これはインスタンスメソッドです。
     * このメソッドを呼び出すには、MyUtilityClass のオブジェクトを先に作成する必要があります。
     */
    public function performInstanceAction(string $data): string
    {
        return "インスタンスメソッドが実行されました: " . strtolower($data);
    }
}

// --- method_exists() を使って静的メソッドの存在を確認する例 ---
echo "--- クラス名文字列でメソッドの存在をチェック ---\n\n";

// キーワード 'static' に最も関連性の高い使用例:
// method_exists() の第一引数にクラス名文字列 ('MyUtilityClass') を渡し、
// 第二引数にチェックしたい静的メソッド名 ('performStaticAction') を渡します。
// method_exists() は、メソッドが静的であるかインスタンスメソッドであるかを区別せず、
// 指定されたクラスにその名前のメソッドが存在すれば true を返します。
if (method_exists('MyUtilityClass', 'performStaticAction')) {
    echo "1. 'performStaticAction' メソッドは 'MyUtilityClass' クラスに存在します。\n";
    // 存在が確認できたので、静的メソッドを直接呼び出すことができます。
    echo MyUtilityClass::performStaticAction("Hello Static World") . "\n";
} else {
    echo "1. 'performStaticAction' メソッドは 'MyUtilityClass' クラスに存在しません。\n";
}

echo "\n";

// 参考: インスタンスメソッドもクラス名文字列で存在チェックできます。
if (method_exists('MyUtilityClass', 'performInstanceAction')) {
    echo "2. 'performInstanceAction' メソッドは 'MyUtilityClass' クラスに存在します。\n";
    // インスタンスメソッドは、クラス名だけでは直接呼び出せません。
    // オブジェクトのインスタンスを作成してから呼び出す必要があります。
    $instance = new MyUtilityClass();
    echo $instance->performInstanceAction("HELLO INSTANCE WORLD") . "\n";
} else {
    echo "2. 'performInstanceAction' メソッドは 'MyUtilityClass' クラスに存在しません。\n";
}

echo "\n";

// 存在しないメソッドのチェック
if (method_exists('MyUtilityClass', 'nonExistentMethod')) {
    echo "3. 'nonExistentMethod' は 'MyUtilityClass' クラスに存在します。\n";
} else {
    echo "3. 'nonExistentMethod' は 'MyUtilityClass' クラスに存在しません。\n";
}

?>

method_exists関数は、指定されたクラスやオブジェクトに特定のメソッドが存在するかどうかを確認するために使用されます。第一引数には、チェック対象となるオブジェクト、またはクラス名を文字列で渡します。第二引数には、確認したいメソッド名を文字列で指定します。メソッドが存在すれば true を、存在しなければ false を真偽値で返します。

サンプルコードでは、MyUtilityClassというクラスが静的メソッドとインスタンスメソッドの両方を含んでいます。method_exists関数の第一引数にクラス名文字列 'MyUtilityClass' を指定し、第二引数にメソッド名 'performStaticAction' を渡すことで、performStaticActionという静的メソッドの存在を確認しています。この関数は、メソッドが静的であるかインスタンスメソッドであるかを区別せず、指定された名前のメソッドがクラスに存在すれば true を返します。したがって、静的メソッドだけでなく、インスタンスメソッドの存在もクラス名文字列で確認可能です。メソッドの存在が確認できた場合、静的メソッドはMyUtilityClass::performStaticAction()のようにクラス名から直接呼び出せますが、インスタンスメソッドはオブジェクトを生成してから呼び出す必要があります。存在しないメソッドに対してはfalseが返されます。

method_exists()関数は、指定されたクラス名文字列やオブジェクトに、目的のメソッドが存在するかを真偽値で確認します。サンプルコードのようにクラス名文字列を第一引数にすることで、静的メソッドの存在も確認可能です。この関数はメソッドが静的かインスタンスメソッドかを区別せず、名前の合致のみを判定します。そのため、存在を確認したメソッドを呼び出す際は、静的メソッドはクラス名::メソッド名()、インスタンスメソッドはオブジェクトを通して正しく呼び出す必要があります。存在しないメソッドを指定するとfalseが返されます。

PHP method_exists でクラス・メソッド存在チェック

<?php

/**
 * サンプルクラス:インスタンスメソッドと静的メソッドを持つ
 */
class ExampleClass
{
    /**
     * これはインスタンスメソッドです。
     * オブジェクトのインスタンスを作成してから呼び出します。
     */
    public function instanceMethod(): string
    {
        return "インスタンスメソッドが実行されました。";
    }

    /**
     * これは静的メソッドです。
     * オブジェクトのインスタンスを作成せずに、クラス名で直接呼び出せます。
     */
    public static function staticMethod(): string
    {
        return "静的メソッドが実行されました。";
    }
}

// ----------------------------------------------------
// method_exists の使用例
// ----------------------------------------------------

echo "--- オブジェクトインスタンスを使ったチェック ---\n";

// ExampleClass のインスタンスを作成
$myObject = new ExampleClass();

// インスタンスメソッド 'instanceMethod' の存在をチェック
if (method_exists($myObject, 'instanceMethod')) {
    echo "myObject に 'instanceMethod' が存在します。\n";
} else {
    echo "myObject に 'instanceMethod' が存在しません。\n";
}

// 静的メソッド 'staticMethod' の存在を、インスタンスを使ってチェック
// 静的メソッドもインスタンスを通してチェックできます。
if (method_exists($myObject, 'staticMethod')) {
    echo "myObject に 'staticMethod' が存在します (静的メソッド)。\n";
} else {
    echo "myObject に 'staticMethod' が存在しません (静的メソッド)。\n";
}

// 存在しないメソッドのチェック
if (method_exists($myObject, 'nonExistentMethod')) {
    echo "myObject に 'nonExistentMethod' が存在します。\n";
} else {
    echo "myObject に 'nonExistentMethod' が存在しません。\n";
}

echo "\n--- クラス名(文字列)を使ったチェック ---\n";

// クラス名 'ExampleClass' を直接指定して、静的メソッドの存在をチェック
if (method_exists('ExampleClass', 'staticMethod')) {
    echo "'ExampleClass' に 'staticMethod' が存在します。\n";
} else {
    echo "'ExampleClass' に 'staticMethod' が存在しません。\n";
}

// クラス名 'ExampleClass' を直接指定して、インスタンスメソッドの存在をチェック
// インスタンスメソッドもクラス名でチェック可能です。
if (method_exists('ExampleClass', 'instanceMethod')) {
    echo "'ExampleClass' に 'instanceMethod' が存在します。\n";
} else {
    echo "'ExampleClass' に 'instanceMethod' が存在しません。\n";
}

// 存在しないメソッドのチェック
if (method_exists('ExampleClass', 'anotherNonExistentMethod')) {
    echo "'ExampleClass' に 'anotherNonExistentMethod' が存在します。\n";
} else {
    echo "'ExampleClass' に 'anotherNonExistentMethod' が存在しません。\n";
}

// 無効なクラス名のチェック (エラーにはならず、falseを返す)
if (method_exists('NonExistentClass', 'someMethod')) {
    echo "'NonExistentClass' に 'someMethod' が存在します。\n";
} else {
    echo "'NonExistentClass' に 'someMethod' が存在しません。\n";
}

PHP 8.4のmethod_exists関数は、指定したオブジェクトまたはクラスに特定のメソッドが存在するかどうかを確認するために使われます。この関数は、動的にメソッドの存在をチェックし、プログラムの安定性を高めるのに役立ちます。

第一引数には、メソッドをチェックしたい「オブジェクトのインスタンス」または「クラス名を文字列」で渡します。第二引数には、確認したい「メソッドの名前を文字列」で指定します。例えば、'instanceMethod''staticMethod'のように記述します。

戻り値は真偽値(bool)で、指定されたオブジェクトやクラスにそのメソッドが存在すればtrueを返し、存在しなければfalseを返します。この関数は、通常のインスタンスメソッドだけでなく、staticキーワードで定義された静的メソッドの存在も確認できます。また、第一引数にクラス名(文字列)を渡した場合でも、そのクラスのインスタンスメソッドや静的メソッドの存在を正しく判別します。存在しないクラス名を第一引数に指定した場合でも、エラーとはならずfalseが返されるため、安全にメソッドの有無を判断できます。

method_exists関数は、指定したオブジェクトまたはクラスに、特定の名前のメソッドが存在するかを真偽値で返します。第一引数には、クラスのインスタンス(オブジェクト)またはクラス名を文字列で指定できます。インスタンスメソッドと静的メソッドのどちらも、インスタンスとクラス名の両方で存在チェックが可能です。存在しないクラス名を指定してもエラーにならず、単にfalseを返しますので、呼び出し元のクラス名が正しいかどうかの確認も重要です。この関数は、メソッドを呼び出す前に存在を確認することで、プログラムの安定性を高めるために利用されます。

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