我将如何做这样的事情:
class Test
{
public function test($methodName) {
$this->$methodName;
}
private function a() {
echo("a");
}
private function b() {
echo("b");
}
}
$testObj = new Test();
$testObj->test("a()");
$testObj->test("b()");
也许我应该传递参数“TYPE”并使用“IF语句”,但我只是好奇! :)
如果“动态函数名称”有一个或多个参数怎么办?
更新:谢谢大家! :)
更新#2 - 答案:
class Test
{
public function testOut($methodName) {
$this->$methodName();
}
private function a() {
echo("a");
}
private function b() {
echo("b");
}
}
$testObj = new Test();
$testObj->testOut("a");
$testObj->testOut("b");
该类的问题是有一个名为“Test”的方法(与类名相同)......我改变了它并且它有效。
答案 0 :(得分:4)
class Test
{
public function test($methodName) {
$this->$methodName();
}
private function a() {
echo("a");
}
private function b() {
echo("b");
}
}
$testObj = new Test();
$testObj->test("a");
$testObj->test("b");
答案 1 :(得分:1)
查看call_user_func()
- 它应该做你想做的事。
答案 2 :(得分:1)
call_user_func 允许您执行此类操作。
例如,
funcname = 'a';
call_user_func(array($testObj, $funcname));
另一种方法是使用 variable methods
例如,
$funcname = 'a';
$testObj->$funcname();
答案 3 :(得分:1)
如果您有一个带有多个参数的“动态函数名称”,则可以使用call_user_func_array,如下所示:
//in class context..
//$parameters can be an array like array(1,2)
call_user_func_array(array($this, $methodName), $parameters);
您希望使用call_user_func_array而不是call_user_func的原因是您可以将函数作为数组传递的参数传递,而不仅仅是作为附加参数传递,从而允许您轻松拥有可变数量的参数。
答案 4 :(得分:0)
按照您的特定示例和用例,完全实现此目的的唯一方法是:
$testObj = new Test();
$testObj->test("a()");
$testObj->test("b()");
将使用eval():
class Test
{
public function test($methodName) {
eval($methodName);
}
private function a() {
echo("a");
}
private function b() {
echo("b");
}
}
$testObj = new Test();
$testObj->test("a()");
$testObj->test("b()");
其他人使用call_user_func()
指出了一个解决方案,这是正确的。显然,比使用eval()进行函数调用要快。阅读本文:
http://nz.php.net/manual/en/function.call-user-func.php#64415