获取类中声明的所有公共方法,而不是继承的方法

2022-08-30 22:12:52

我想从继承树中的最低类中获取所有公共方法的数组,并且仅获取公共方法的数组。例如:

class MyClass {  }

class MyExtendedClass extends MyClass {  }

class SomeOtherClass extends MyClass {  }

从MyClass内部,我想从MyExtendedClass和SomeOtherClass中获取所有PUBLIC方法。

我发现我可以使用Reflective Class来做到这一点,但是当我这样做时,我也从MyClass中获取方法,我不想获取它们:

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

有没有办法做到这一点?或者在这种情况下,我唯一的解决方案就是过滤掉反射类的结果?


答案 1

不,我不认为你可以一次过滤掉父方法。但是,仅按类索引筛选结果非常简单。

$methods = [];
foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method)
    if ($method['class'] == $reflection->getName())
         $methods[] = $method['name'];

答案 2

我刚刚写了一个具有一些额外功能的方法,该方法扩展了Daniel的答案。

它只允许您返回静态或对象方法。

它还允许您仅返回已在该类中定义的方法。

提供自己的命名空间或仅复制该方法。

用法示例:

$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;
    }
}

推荐