PHP:如何将变量添加到函数名中?

4

我有一个带回调函数的类。我向该类传递一个字符串,回调函数将使用该字符串作为回调函数。它的工作方式有点像这样:

$obj->runafter( 'do_this' );

function do_this( $args ) {
    echo 'done';
}

我想要做的是在循环内运行这个函数,并且为了避免多次编写该函数,我想在函数名称中添加一个变量。我的想法是这样的:
for( $i=0;$i<=3;$i++ ) :
    $obj->runafter( 'do_this_' . $i );

    function do_this_{$i}( $args ) {
        echo 'done';
    }
endfor;

有什么想法可以用PHP实现这个吗?
3个回答

6
我会直接将函数作为闭包传入:
for($i=0; $i<=3; $i++) {
    $obj->runafter(function($args) use($i) {
        echo "$i is done";
    });
}

注意,如果需要,在回调函数中可以使用use($i)来使此局部变量可用。
以下是一个有效的示例:https://3v4l.org/QV66p 有关可调用和闭包的更多信息: http://php.net/manual/en/language.types.callable.php

1
@KyleE4K 刚刚更新了一个可用的示例链接。 - jszobody
我想知道在C#(更强类型的语言)中是否可能实现这个功能 - 研究时间哈哈 - Jaquarh
@KyleE4K 当然可以。在C#中,您可以使用委托。 - Robert
@KyleE4K 准备好颠覆认知了吗?在 PHP 7 中,你也可以动态创建匿名类!http://php.net/manual/en/language.oop5.anonymous.php - jszobody
1
运行完美!谢谢! - Aaron
显示剩余2条评论

2

点赞,因为展示了如何首先将函数定义为闭包。请注意,在函数定义的末尾需要一个分号,如果打开了通知,您将收到“注意:未定义变量:i”的提示。 - jszobody

0
根据你的问题,你应该在循环之前定义好函数。这样你就不必担心它会在每次循环迭代时被重新定义。
function do_this( $args ) {
    echo 'done';
}

for( $i=0;$i<=3;$i++ ) :
    $obj->runafter( 'do_this' );
endfor;

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