2014-10-30 62 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

相關問題