【问题标题】:Get string representation of anonymous function获取匿名函数的字符串表示
【发布时间】:2014-03-10 18:29:46
【问题描述】:

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

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

是否可以获得匿名函数$l的字符串表示,即包含函数体的字符串?

我尝试了一些方法:

  • echo $l; PHP Catchable 致命错误:类 Closure 的对象无法转换为字符串
  • var_dump($l); class Closure#1 (0) { }
  • echo $l-&gt;__toString();: 调用未定义的方法 Closure::__toString()
  • get_class_methods($l) 返回 array('bind', 'bindTo'),所以似乎不存在未记录的方法
  • $r = new ReflectionClass($l);:getProperties()、getConstants() 和 getStaticProperties() 都是空的,$r-&gt;__toString() 也没有返回任何有用的东西。

我的代码中并不需要这个,我只是认为如果出现问题,它可能对日志记录有用。在我自己无法提出解决方案之后,我很好奇这是否可能。

【问题讨论】:

  • 你怎么看create_function(),这样你就可以将函数内容作为字符串,只需要通过这个函数给它命名吗?
  • @Javad 这是个好主意。但是,我想将匿名函数作为方法参数传递。当然,我可以简单地传递一个字符串和方法的参数并使用create_function(),但是只会在运行时检查语法,这与匿名函数的想法相矛盾。
  • 是的,你是对的,但是如果你查看create_function() 的手册,你可以通过这个[ca1.php.net/create_function](查看第一个示例)创建一个匿名函数
  • 没有。闭包像任何其他代码一样在运行时编译。解决这个问题的唯一方法是将函数体存储为字符串并使用@Javad 已经声明的create_function()

标签: php closures anonymous-function


【解决方案1】:

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

不要陷入the same trap as @argon did 的想法,认为一个简单的基于substr_count 的脚本实际上可以解析PHP 代码。它太脆弱了,即使是最简单的例子也会以光荣的方式收支平衡。

以防万一:

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

致命错误:未捕获的异常:在

中的上下文定义过于复杂

https://3v4l.org/CEmqV

【讨论】:

  • 无需昂贵的PHP解析;如果源代码太杂乱,则应将其整理以提高可读性。 ..你上面的例子是不公平的,你为什么不简单地编辑答案?对你来说太复杂了?
  • 上面的例子有什么“乱七八糟”的地方吗?
  • 查看@fairness 上面的编辑评论,看我可以更新函数以使其“完美”(对于任何关闭 - 在一行上) - 但这会使它变得比必要的更复杂。跨度>
  • 我已经删除了我的答案,因为没有人有时间评论或编辑,只能投反对票;你应该为自己感到羞耻。
【解决方案2】:

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

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

(提示,你可能想看看func_get_args()

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2019-08-22
    • 2019-03-24
    相关资源
    最近更新 更多