我可以在php中分配一个函数吗?

时间:2014-10-30 15:32:00

标签: php function functional-programming

我想知道我是否可以分配一个功能。

我有一个函数调用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);

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

3 个答案:

答案 0 :(得分:0)

您可以在功能中添加一个开关。可能看起来像:

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
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

你无法重新分配这样的功能。您可以做的最好的事情是将if-else封装在辅助函数中:

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

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