ReflectionMethod获取方法源和参数

时间:2012-02-29 09:43:48

标签: php reflection methods

我想通过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 个答案:

答案 0 :(得分:3)

假设有一个类

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的唯一有效用法是生成列出这些选项的文档块,并同意如果您在生产代码中需要这样做,则可能会出错。