2015-03-26 3 views
0

Я хотел бы получить не унаследованные общедоступные методы дочернего класса. Я попытался использовать Reflection Api следующим образом:Как получить не унаследованные методы класса PHP?

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

Но это делает много избыточной логики. Я должен получить все геттеры или сеттеры автоматически, потому что я получил более 60 из них!

+1

60 гетры/сеттеры ಠ_ಠ –

ответ

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

для проверки, если он начинается с «получить» на всех, если он находится в надлежащем классе и, наконец, если это не в exluded имен методов.

Наконец, целое array_filter() приводит к удалению до array_map() только для их преобразования из объектов в строки, не содержащие слова «get»;


PS: В основном оптимизация и запутывания еще дальше;)

2. Phalcon Модель :: columnMap

Или просто:

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

но вам может понадобиться фильтр- поле «Id»;

Смежные вопросы