回答編集履歴

1

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

2018/11/24 11:21

投稿

maisumakun
maisumakun

スコア145184

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