【问题标题】:ReflectionMethod get method source and parametersReflectionMethod 获取方法源和参数
【发布时间】:2026-01-06 23:05:01
【问题描述】:

我想通过 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'

【问题讨论】:

  • 很好奇你为什么需要它? o_O
  • 我可以使用 jQuery 调用类中的所有方法,如果需要参数,请打开附加表单以将它们包含在请求中
  • 不清楚你到底在做什么,但很明显你做错了

标签: php reflection methods


【解决方案1】:

假设一个类像

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

【讨论】:

  • new LimitIterator(new SplFileObject($reflector->getFileName()), $reflector->getStartLine(), $reflector->getEndLine() - $reflector->getStartLine()