2014-10-30 61 views
0

我想知道我是否可以分配函数。我可以在php中指定一个函数吗

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

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

我不想用这个的if-else在每一个调用函数mpurl的,所以我想全局更改功能mpurl的意义。

所以这里的问题来了,我可以写这样的:

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

或我怎么能实现这个目的是什么?谢谢。

回答

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

+1

或者你做'$ func($ a,$ b,$ c);':-) – jeroen 2014-10-30 15:42:50

+1

@jeroen:只是测试,以确保它甚至可能,将它添加到我的答案 – 2014-10-30 15:44:08

+0

是的,http:///php.net/manual/en/functions.variable-functions.php – jeroen 2014-10-30 15:44:32

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等于'符号',则停止执行该函数的其余部分并立即返回结果。如果是其他情况,则继续执行该功能的其余部分。

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 
} 
+0

我不想修改这个函数,我想定义一个新函数。因为'mpurl'函数非常长,我的'my_mpurl'可以很短。 – xcaptain 2014-10-30 15:39:46

+0

@xcaptain所以从开关内部调用'my_mpurl'或者使用第三个函数来确定调用哪个函数。 – jeroen 2014-10-30 15:41:33

0

你不能重新分配一个这样的函数。你能做的最好的是封装的if-else中的辅助功能:对其他代码

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

然后做一个搜索&替换所以它无处不在,调用辅助函数。

+0

希望有一天PHP会支持函数重命名。 – xcaptain 2014-10-30 16:53:16

+0

@xcaptain这听起来很可怕和令人困惑。 – Boann 2014-10-30 18:32:27

相关问题