【问题标题】:php print callable functionphp打印可调用函数
【发布时间】:2014-10-19 20:10:04
【问题描述】:

我正在尝试解决一个问题:

function f($callable_function){
   print_r($callable_function);// doesn't work at all, of course
}

f(function(){echo "hello World"});

我通过 print_r 函数获得了 Closure Object 元素。有没有办法得到:

//OUTPUT RESULT
echo "hello World";

编辑

这样做的目的是获取字符串中的函数声明(稍后用于数据库)。任何开发人员都可以使用 f 函数,因此我们的想法是使其尽可能简单,这意味着我不希望开发人员在字符串中声明他的函数。

【问题讨论】:

  • PHP 不是 JavaScript,你不能这样打印源代码...
  • 你只能得到hello world,不能和echo 一起得到
  • 如果你想实际执行该函数并从中获取输出,那么就这样做吧,我不知道你认为在它上面使用print_r会得到什么。
  • 这次尝试有目标吗?
  • 如果你描述什么你试图达到,而不是描述如何你失败了,你会得到更好的答案使用您认为正确的解决方案。经典的 XY 问题。

标签: php callable


【解决方案1】:

你可以将PHP文件作为字符串获取,然后找到函数(下面这个例子很快,应该改进一下):

function f($callable_function) {
    $f = file_get_contents(__FILE__);
    preg_match("#function $callable_function\(.*\)[^\{]*{(.*)}#Us", $f, $matches);
    var_dump($matches);
}

function a() {
    echo "hello World";
}

f('a');

但有一些限制:

  • 例如,如果您有很多 PHP 文件,这可能会很复杂
  • 我的示例不支持将字符 { 放入函数体中,但这可以由擅长正则表达式的人改进
  • 它不适用于匿名回调(可能也不适用于对象的方法)

【讨论】:

  • 我喜欢这个解决方案,这可能是我的解决方案的替代品,但我很乐意使用匿名函数。但是谢谢你的帮助:-)
  • 这个答案很有帮助:我使用了 preg_match 函数名称:$reflFunc = new ReflectionFunction($callable); $file = file_get_contents($reflFunc->getFileName()); $reflFunc->getStartLine(); $reflFunc->getEndLine();
  • 如果函数是动态声明的(有时是可调用的),那么这可能是在整个项目中长时间搜索正确的文件
【解决方案2】:

从未关闭过这个问题,但自 2014 年以来我就有了答案:

 $reflFunc = new ReflectionFunction($callable);
 $filename = $reflFunc->getFileName()); 
 $startline = $reflFunc->getStartLine(); 
 $endline = $reflFunc->getEndLine();

使用preg_match,我可以提取我需要的东西。 (如建议的 第一个答案)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多