【问题标题】:Can I assign a function in php我可以在php中分配一个函数吗
【发布时间】:2014-12-26 17:45:29
【问题描述】:

我想知道我是否可以分配一个函数。

我有一个函数调用mpurl($s, $pagevar, $pages),这个函数调用在我的代码中出现了很多次。现在我想为此功能添加更多案例。喜欢:

if(strpos($s, 'sign') !== false) {
    mpurl($s, $pagevar, $pages);
} else {
    my_mpurl($s, $pagevar, $pages);
}

我不想在函数mpurl的每次调用中都使用这个if-else,所以我想全局更改函数mpurl的含义。

那么问题来了,我可以这样写吗:

if(strpos($s, 'sign') === false) {
    mpurl = my_mpurl;
}
mpurl($s, $pagevar, $pages);

或者我该如何实现这个目的?谢谢。

【问题讨论】:

    标签: php function functional-programming


    【解决方案1】:

    更新
    回顾一下下面的答案。如果两个函数以相同的顺序采用相同的参数,则可以简单地使用变量函数:

    if (strpos($s, 'sign') === false) {
        $func = 'my_mpurl';
    } else {
        $func = 'mpurl';
    }
    $func($s, $pagevar, $pages);
    

    如果由于某种原因您无法升级并且卡在旧版本中,您可以使用call_user_func_array

    if (strpos($s, 'sign') === false) {
        $func = 'my_mpurl';
    } else {
        $func = 'mpurl';
    }
    call_user_func_array($func, array($s, $pagevar, $pages));
    

    当然,您可以使用$func var 尽可能多地使用/需要在需要时调用该函数。


    所以基本上,根据某个变量的值,您希望使用相同的参数调用不同的函数。这就是call_user_func_array 的用途:

    if (strpos($s, 'sign') === false) {
        $func = 'my_mpurl';
    } else {
        $func = 'mpurl';
    }
    call_user_func_array($func, array($a, $b, $c));
    

    同样的事情,但短一点(并且使用短数组语法):

    $func = 'mpurl';
    if (strpos($s, 'sign') === false)
        $func = 'my_'.$func;//prepend
    call_user_func_array($func, [$s, $pagevar, $pages]);
    //or even shorter
    $func($s, $pagevar, $pages);
    

    变量值作为函数名(变量函数)语法是在 PHP 5.3 中引入的。如果你还没有在 5.3 上运行,你真的应该升级,但同时,你可以使用call_user_func_array

    【讨论】:

    • 或者你做$func($a, $b, $c); :-)
    • @jeroen:只是在测试,以确保这甚至可能,将其添加到我的答案中
    • @EliasVanOotegem 太好了,我刚刚测试了call_user_func_array,它可以工作。谢谢,所以我不需要修改其他人的代码并且可以添加新功能。真的很有帮助。
    • @xcaptain:也尝试使用$func($s, $pagevar, $pages):如果您运行的是PHP 5.3>=,那也可以,而且它比call_user_func_array 要干净得多跨度>
    • @xcaptain:请阅读本网站的帮助部分:请您不要发布“谢谢” cmets。相反,表示感谢的堆栈溢出方式是接受对您有帮助的答案。如果你不知道怎么做,see this meta question,它解释了一切。接受会给你 +2 代表,以鼓励接受回复,因此请检查以前的问题并将一些答案标记为已接受
    【解决方案2】:

    您可以在函数内添加一个开关。可能看起来像:

    function mpurl($a,$b,$c) {
    
        switch ($a) {
            case 'sign' : 
                // do some stuff
            break;
            default : 
                // do some other stuff
            break;
        }
    
        // do some common stuff in the function
    }
    

    另一种可能性(根据您的评论)可能如下。如果$a 等于'sign',则停止执行函数的其余部分并立即返回结果。如果是其他情况,您将继续执行该功能的其余部分。

    function mpurl($a,$b,$c) {
    
        switch ($a) {
            case 'sign' : 
                // do some stuff 
                return $result;
            break;
            default : 
                // do some other stuff
            break;
        }
    
        // do some common stuff in the function
    }
    

    【讨论】:

    • 我不想修改这个函数,我想定义一个新函数。因为函数mpurl很长,而我的my_mpurl可以很短。
    • @xcaptain 所以从交换机内部调用my_mpurl 或使用第三个函数来确定调用哪个函数。
    【解决方案3】:

    您不能重新分配这样的功能。你能做的最好的就是将 if-else 封装在一个辅助函数中:

    function mpurlx($s, $pagevar, $pages) {
        if (strpos($s, 'sign') !== false) {
            mpurl($s, $pagevar, $pages);
        } else {
            my_mpurl($s, $pagevar, $pages);
        }
    }
    

    然后对其他代码进行搜索和替换,以便它在任何地方调用辅助函数。

    【讨论】:

    • 希望有一天php支持函数重命名。
    • @xcaptain 这听起来既可怕又令人困惑。
    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 2010-10-17
    • 2011-11-18
    • 2013-07-10
    • 2014-01-12
    • 2023-03-14
    • 2021-07-10
    • 2011-03-20
    相关资源
    最近更新 更多