開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. 【PHP】PHPでメソッド存在チェックを行う方法
no-image

【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');
  • posted by ナカエ
  • PHP
TOPに戻る