質問するログイン新規登録

回答編集履歴

1

元のコードでは動かなかったので、全面修正

2018/11/24 11:21

投稿

maisumakun
maisumakun

スコア146783

answer CHANGED
@@ -1,10 +1,11 @@
1
- 直接的に行う方法はありませんので、以下のよう手順なると思い
1
+ ※元コードは動かかったので全面的書き換えした
2
2
 
3
- 0. `get_class`でクラスを取得する
4
- 0. `get_class_methods`でメソッドのリスを取得
3
+ リフレクションAPIの`ReflectionMethod::getDeclaringClass`([ファレン](http://php.net/manual/ja/reflectionmethod.getdeclaringclass.php))使えば、定義されたクラスを取得できます([3v4lでの動作例](https://3v4l.org/dcX17))。
5
- 0. リストに当該のメソッドがあればそこで終了
6
- 0. `get_parent_class`で親クラスを取得
7
- 0. 親クラスが見つからなければ終了
8
- 0. 1に戻る
9
4
 
5
+ ```php
6
+ $refClass = new ReflectionClass($class_name);
7
+ $refMethod = $refClass->getMethod($method_name);
8
+ $declaredClass = $refMethod->getDeclaringClass();
9
+ ```
10
+
10
- ただし、`__call()`という**マジックメソッド**があって、宣言ていないメソッド呼べてしうので、当該メソッドマジックメソッドだった場合検出できません。
11
+ なお、`__call`を使えば存在しないメソッド呼べま、これに対応していません。