背景
PHP PHP

【PHP】PHPでメソッド存在チェックを行う方法

こんにちは、スズキです。
今回はPHPでメソッド存在チェックを行う方法を紹介します。


先日、Laravelを用いたPCサイト/スマホサイトの分岐ロジックを作成していました。
その際に、Controllerクラスのメソッド存在チェックを行うことになったのですが、
依存性の注入を行う前に処理を行う関係でインスタンス生成を行わずにメソッド存在チェックを行う必要がありました。

そこで、以下の条件を満たしたメソッド存在チェックが必要になりました。
  • インスタンス生成を行わずにメソッド存在チェックを行う。
  • (できれば)publicメソッドとprivateメソッドの区別がつく
(ちなみに、method_existsメソッドは上記条件をどちらも満たしていません。)


そういうわけで、良い方法が無いかを探すためにネットの海を徘徊することになったわけですが、
色々と探してみたところ、ReflectionMethodクラスを使うことで上記条件を満たしたメソッド存在チェックが可能であることが判明しました。

というわけで、上記条件を満たした「メソッド存在チェック」用メソッドは以下になります。
    /**
     * staticメソッドが存在するかを調べます。
     * @param $className
     * @param $methodName
     * @return bool
     */
    public static function isExistStaticMethod($className, $methodName)
    {
        $isExist = self::isExistMethodSub("static", $className, $methodName);
        return $isExist;
    }

    /**
     * publicメソッドが存在するかを調べます。
     * @param $className
     * @param $methodName
     * @return bool
     */
    public static function isExistPublicMethod($className, $methodName)
    {
        $isExist = self::isExistMethodSub("public", $className, $methodName);
        return $isExist;
    }

    /**
     * privateメソッドが存在するかを調べます。
     * @param $className
     * @param $methodName
     * @return bool
     */
    public static function isExistPrivateMethod($className, $methodName)
    {
        $isExist = self::isExistMethodSub("private", $className, $methodName);
        return $isExist;
    }

    /**
     * protectedメソッドが存在するかを調べます。
     * @param $className
     * @param $methodName
     * @return bool
     */
    public static function isExistProtectedMethod($className, $methodName)
    {
        $isExist = self::isExistMethodSub("protected", $className, $methodName);
        return $isExist;
    }

    /**
     * メソッドが存在するかを調べます。(サブ処理)
     * @param $judgeType
     * @param $className
     * @param $methodName
     * @return bool
     */
    private static function isExistMethodSub($judgeType, $className, $methodName)
    {
        // メソッド情報取得
        // ※補足:メソッドが存在しない場合はExceptionが発生します。
        try {
            $reflectionMethod = new \ReflectionMethod($className, $methodName);
        } catch (\Exception $e) {
            // 該当メソッドが存在しない場合
            return false;
        }

        $isExist = false;
        switch ($judgeType) {
            case "static":
                $isExist = $reflectionMethod->isStatic();
                break;
            case "public":
                $isExist = $reflectionMethod->isPublic();
                break;
            case "private":
                $isExist = $reflectionMethod->isPrivate();
                break;
            case "protected":
                $isExist = $reflectionMethod->isProtected();
        }
        return $isExist;
    }

上記メソッドは以下のように使います。
$isExistMethod = CommonUtil::isExistPublicMethod(TestController::class, 'index');
≪ 【Django】WindowsのVisual StudioでDjangoを動かしてみた  |  【Laravel】空のリレーションを手軽に設定する方法 ≫

Web制作のお問い合わせ

075-744-6842

(平日/土曜 10:00~17:00)

 お問い合わせ