获取匿名函数的字符串表示形式

10

假设我有一个匿名的PHP函数,就像这样:

<?php
$l = function() { echo "hello world"; };

有没有可能获得匿名函数 $l 的字符串表示形式,即包含函数体的字符串?
我尝试了一些方法:
  • echo $l; PHP 可捕获致命错误:无法将闭包类的对象转换为字符串
  • var_dump($l); 类 Closure#1 (0) { }
  • echo $l->__toString();: 调用未定义的方法 Closure::__toString()
  • get_class_methods($l) 返回 array('bind', 'bindTo'),因此似乎不存在未记录的方法
  • $r = new ReflectionClass($l);: getProperties()、getConstants() 和 getStaticProperties() 都为空,同时 $r->__toString() 没有返回有用的内容。
我并不需要在代码中实现这个功能,只是想在出现问题时记录日志会很有用。我自己找不到解决方案,因此很好奇是否可能实现。

你认为 create_function() 怎么样?这样你就可以将函数内容作为字符串传递,然后通过该函数仅需为其命名即可。 - Javad
@Javad 这是个好主意。不过,我想将匿名函数作为方法参数传递。当然,我可以简单地传递一个字符串和方法的参数,然后使用create_function(),但这样语法只会在运行时检查,有点违背了匿名函数的概念。 - Michael Osl
是的,你说得对,但如果你查看create_function()的手册,你可以按照这个方式创建一个匿名函数[http://ca1.php.net/create_function](请查看第一个示例)。 - Javad
不。闭包和其他代码一样在运行时编译。唯一的解决方法是将函数体存储为字符串,并像@Javad已经提到的那样使用create_function() - Sammitch
2个回答

4

你唯一“真正”的选择是使用一个实际的PHP解析器来解析匿名函数。

不要像@argon那样掉进同样的陷阱中,认为一个简单的substr_count脚本可以解析PHP代码。它太容易出错了,即使是最简单的例子也会以令人惊叹的方式崩溃。

举个例子:

$dog2 = ['bark'=>function($foo = '{'){}];

致命错误:未捕获的异常:上下文定义过于复杂

https://3v4l.org/CEmqV


1
不需要昂贵的PHP解析;如果源代码太乱,则应该整理以提高可读性。而且你上面的例子是不公平的,为什么不直接编辑答案?对你来说太复杂了吗? - user4244405
1
以上示例有什么地方“混乱”了吗? - PeeHaa
请看上面编辑的评论@公平,我可以更新这个函数使其“完美”(适用于任何闭包-在一行上)-但这会使它比必要的更复杂。 - user4244405
我已经删除了我的回答,因为没有人有时间评论或编辑,只会进行负面评价;你应该感到羞耻。 - user4244405

-2

访问匿名文件的源代码是自相矛盾的。如果您需要引用源代码,则不要创建匿名函数:

$myfunction='echo "hello world";';
$l = create_function($myfunction);
print highlight_string($myfunction) . " results in....<br />";
$l();

(提示,您可能需要查看func_get_args()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接