16

私が取得したいのは、継承ツリーの最下位クラスからのすべてのパブリックメソッドの配列であり、パブリックメソッドのみです。例えば:

class MyClass {  }

class MyExtendedClass extends MyClass {  }

class SomeOtherClass extends MyClass {  }

そして、MyClassの内部から、MyExtendedClassとSomeOtherClassからすべてのPUBLICメソッドを取得したいと思います。

Reflection Classを使用してこれを実行できることがわかりましたが、これを実行すると、MyClassからメソッドも取得するため、取得したくありません。

$class = new ReflectionClass('MyClass');
$methods = $class->getMethods(ReflectionMethod::IS_PUBLIC);

これを行う方法はありますか?または、この状況で私が持っている唯一の解決策は、リフレクションクラスの結果を除外することだけですか?

4

3 に答える 3

20

いいえ、親メソッドを一度に除外できるとは思いません。しかし、クラス インデックスで結果をフィルター処理するのは非常に簡単です。

$methods = [];
foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method)
    if ($method['class'] == $reflection->getName())
         $methods[] = $method['name'];
于 2012-10-10T17:48:14.137 に答える
2

ダニエルの答えを拡張するいくつかの追加機能を備えたメソッドを作成しました。

静的メソッドまたはオブジェクト メソッドのみを返すことができます。

また、そのクラスで定義されているメソッドのみを返すこともできます。

独自の名前空間を指定するか、メソッドをコピーしてください。

使用例:

$methods = Reflection::getClassMethods(__CLASS__);

コード:

<?php

namespace [Your]\[Namespace];

class Reflection {
    /**
     * Return class methods by scope
     * 
     * @param string $class
     * @param bool $inherit 
     * @static bool|null $static returns static methods | object methods | both
     * @param array $scope ['public', 'protected', 'private']
     * @return array
     */
    public static function getClassMethods($class, $inherit = false, $static = null, $scope = ['public', 'protected', 'private'])
    {
        $return = [
            'public' => [],
            'protected' => [],
            'private' => []
        ];
        $reflection = new \ReflectionClass($class);
        foreach ($scope as $key) {
            $pass = false;
            switch ($key) {
                case 'public': $pass = \ReflectionMethod::IS_PUBLIC;
                    break;
                case 'protected': $pass = \ReflectionMethod::IS_PROTECTED;
                    break;
                case 'private': $pass = \ReflectionMethod::IS_PRIVATE;
                    break;
            }
            if ($pass) {
                $methods = $reflection->getMethods($pass);
                foreach ($methods as $method) {
                    $isStatic = $method->isStatic();
                    if (!is_null($static) && $static && !$isStatic) {
                        continue;
                    } elseif (!is_null($static) && !$static && $isStatic) {
                        continue;
                    }
                    if (!$inherit && $method->class === $reflection->getName()) {
                        $return[$key][] = $method->name;
                    } elseif ($inherit) {
                        $return[$key][] = $method->name;
                    }
                }
            }
        }
        return $return;
    }
}
于 2015-01-07T10:57:39.803 に答える