2011-01-10 68 views
13

有沒有辦法通過變量調用函數?php - 動態調用函數

例如,我想調用函數Login()。我可以這樣做:

$varFunction = "Login"; //to call the function 

我可以使用$ varFunction嗎?

+1

是的,PHP支持這個。但我強烈建議不要使用它,除非你是受虐狂或計劃一些破壞 – 2011-01-10 12:50:43

+2

嗨,其實原因是因爲我想有相同的功能名稱,但對於不同的模塊。所以例如登錄模塊和Profile模塊都有一個函數調用main() – nuttynibbles 2011-01-10 12:52:12

+0

Doh! **繼承**它! – 2011-01-10 12:53:28

回答

23

是的,你可以:

$varFunction(); 

或者:

call_user_func($varFunction); 

確保您驗證$ varFunction惡意輸入。


編輯:

你的模塊,可以考慮這樣的事情(根據您的實際需求):

abstract class ModuleBase { 
    public function main() { 
    echo 'main on base'; 
    } 
} 

class ModuleA extends ModuleBase { 
    public function main() { 
    parent::main(); 
    echo 'a'; 
    } 
} 

class ModuleB extends ModuleBase { 
    public function main() { 
    parent::main(); 
    echo 'b'; 
    } 
} 

function runModuleMain(ModuleBase $module) { 
    $module->main(); 
} 

然後用正確的模塊實例調用runModuleMain()。

6

可以使用...

$varFunction = "Login"; 
$varFunction(); 

...和它不言而喻,以確保該變量是可信的。

2
<?php 
    $fxname = 'helloWorld'; 

    function helloWorld(){ 
    echo "What a beautiful world!"; 
    } 

    $fxname(); //echos What a beautiful world! 
?> 
0

你真的應該考慮對模塊使用類,因爲這樣可以讓你有一致的代碼結構,並保持幾個模塊的方法名稱相同。這也會讓您靈活地繼承或更改每個模塊的代碼。

關於除上述調用方法(即使用變量作爲函數名稱或函數族)的主題,從PHP 5.3開始,您可以使用動態匿名函數closures,它可以爲您提供以另一種方式去做你想做的事。