php - 动态调用函数

时间:2011-01-10 12:49:49

标签: php

有没有办法通过变量调用函数?

例如我想调用函数Login()。我可以这样做:

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

我可以使用$ varFunction吗?

6 个答案:

答案 0 :(得分:25)

是的,你可以:

$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()。

答案 1 :(得分:6)

你可以使用......

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

......不用说确保变量是可信的。

答案 2 :(得分:2)

 <?php
  $fxname = 'helloWorld';

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

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

答案 3 :(得分:1)

我成功调用了函数,如下所示:

$methodName = 'Login';
$classInstance = new ClassName();
$classInstance->$methodName($arg1, $arg2, $arg3);

它适用于PHP 5.3.0+

我也在Laravel工作。

答案 4 :(得分:0)

你真的应该考虑使用模块类,因为这将允许你们拥有一致的代码结构并保持几个模块的方法名称相同。这也使您可以灵活地继承或更改每个模块的代码。

关于主题,除了调用上述方法(即使用变量作为函数名称,或call_user_func_ *函数系列)之外,从PHP 5.3开始,您可以使用动态closures匿名函数,可以为您提供另一种方法来完成您想要的工作。

答案 5 :(得分:0)

如果属于同一班级:

$funcName = 'Login';

// Without arguments:
$this->$funcName();

// With arguments:
$this->$funcName($arg1, $arg2);

// Also acceptable:
$this->{$funcName}($arg1, $arg2)

如果在其他班级:

$someClass = new SomeClass(); // create new if it doesn't already exist in a variable
$someClass->$funcName($arg1, $arg2);

// Also acceptable:
$someClass->{$funcName}($arg1, $arg2)

提示

如果函数名称也是动态的:

$step = 2;

$this->{'handleStep' . $step}($arg1, $arg2);
// or
$someClass->{'handleStep' . $step}($arg1, $arg2);

这将根据handleStep1()的值调用handleStep2()$step等。