如何获取非继承的PHP类方法?

时间:2015-03-26 12:35:51

标签: php inheritance reflection phalcon

我想获得非继承的子类公共方法。我试过像这样使用Reflection Api:

$class = new \ReflectionClass($model);
$modelMethods = $class->getMethods(\ReflectionMethod::IS_PUBLIC);
$exclude = ['getSource', 'upsert', 'getUniqueKeyAttributes', 'beforeSave', 'columnMap', 'initialize', 'setId', 'getId'];
$CLASS = __CLASS__;

$props = array_filter(array_map(function(\ReflectionMethod $method) use ($exclude, $CLASS) {
    if($method->class === $CLASS && !in_array($method->name, $exclude)) {
        if(strpos($method->name, 'get') === 0) {
            return str_replace('get', '', $method->name);
        }
    }
}, $props));

但是这会产生很多冗余逻辑。我必须自动获取所有的getter或setter,因为我有超过60个!

1 个答案:

答案 0 :(得分:1)

1。坚持使用现有解决方案

我只需将array_filter替换为array_map,以便更有效地进行内部过滤。在您100%控制它时,声明函数参数的类型不是必需的,但会减慢PHP的速度。 substr()也应显得比str_replace()更快。

让我支持一个完全相同但又不同的代码的简短例子:

    $class = 'Application\Entity\ExamplePhalconModel';

    // ure filtering those with "get" only
    $exclude = array_flip(['getSource', 'getId']);

    $result = array_map(function($v) { return substr($v->name, 3); } , array_filter((new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC), function ($v) use ($class, $exclude) {
        return (strpos($v->name, 'get') === 0 && $v->class === $class) && !array_key_exists($v->name, $exclude);
    }));

分解,首先我正在创建一个用(new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC)检查的类的反射。将此作为第一个参数放到array_filter()允许我省略一些变量声明。作为第二个参数,函数中只有if

function ($v) use ($class, $exclude) {
    return (strpos($v->name, 'get') === 0 && $v->class === $class) && !array_key_exists($v->name, $exclude);
}

用于检查是否以" get"如果它在适当的类中,最后,如果它不在被排除的方法名称中。

最后,整个array_filter()结果只能将array_map()转换为从对象转换为不包含" get"的字符串。字;


PS:主要是进一步优化和混淆;)

2。 Phalcon Model :: columnMap

或者只是:

$props = array_map(function($str) {
        return \Phalcon\Text::camelize($str);
    }, array_values(Application\Entity\ExamplePhalconModel::columnMap()));

但您可能需要过滤掉“ID&ID”。场;