ReflectionMethod получить метод источник и параметры - PullRequest
1 голос
/ 29 февраля 2012

Я хотел бы иметь доступ к методам ReflectionMethod:

$r = new ReflectionMethod($class, $method);
$params = $r->getParameters();

и, если требуются параметры ($ Option), получите источник этого метода для подготовки параметров:

public function GetFeedback($Options) {
    $this->checkConnection();
    return $this->_client->doGetFeedback(
        $Options['feedback-from'],
        $Options['feedback-to']
    );
}

поэтому в моем примере нужно найти ключи $ Option - 'feedback-from' и 'feedback-to'

1 Ответ

3 голосов
/ 29 февраля 2012

Предполагая, что класс, как

class Foo
{
    public function GetFeedback($Options) {
        $this->checkConnection();
        return $this->_client->doGetFeedback(
            $Options['feedback-from'],
            $Options['feedback-to']
        );
    }
}

, этот код будет делать то, что вы просите

$reflector = new ReflectionMethod('Foo', 'GetFeedback');
$methodBody = implode(
    '',
    iterator_to_array(
        new LimitIterator(
            new SplFileObject($reflector->getFileName()),
            $reflector->getStartLine(),
            $reflector->getEndLine() - $reflector->getStartLine()
        )
    )
);
foreach ($reflector->getParameters() as $parameter) {
    if (!$parameter->isOptional()) {
        preg_match_all(
            sprintf('{\$%s\[[\'"](.*)[\'"]\]}', $parameter->getName()),
            $methodBody,
            $matches
        );
    }
    print_r($matches);
}

Вывод:

Array
(
    [0] => Array
        (
            [0] => $Options['feedback-from']
            [1] => $Options['feedback-to']
        )

    [1] => Array
        (
            [0] => feedback-from
            [1] => feedback-to
        )
)

Однако, единственное допустимое использованиедля этого подхода IMO должен сгенерировать докблок, перечисляющий эти опции, и согласиться, что вы, вероятно, делаете это неправильно, если вам это нужно в рабочем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...