使用PHP调用对象上的更改函数名称:如何?

时间:2009-06-19 03:04:55

标签: php

我将如何做这样的事情:

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”的方法(与类名相同)......我改变了它并且它有效。

5 个答案:

答案 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() - 它应该做你想做的事。

Documentation here

答案 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