2009-06-19 100 views
2

我怎么会做这样的事情:用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()"); 

也许我应该只是传递一个参数“类型”和使用“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”(同一个类名)方法......我改变了它它的工作。

回答

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"); 
+0

其实它给了我一个错误: 方法名称必须是一个字符串.... :( – mrmuggles 2009-06-19 03:23:33

+1

方法名是“构造”,因为它是相同的名称班,所以这就是为什么它没有工作,我认为。我用你的代码发布了一个更新,只改变了“testOut”的测试方法 – mrmuggles 2009-06-19 03:31:24

+0

UR正确,自从我使用CPP,C#和其他OOP语言以来没有__construct – 2009-06-19 04:00:06

1

call_user_func允许你做这样的事情。

例如,

funcname = 'a'; 
call_user_func(array($testObj, $funcname)); 

另一种方法是使用variable methods

例如,

$funcname = 'a'; 
$testObj->$funcname(); 
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的call_user_func_array的原因是,你可以通过该功能将作为数组的参数,而不是仅仅作为附加参数,从而让您轻松拥有可变数量的参数。

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

+0

为什么要指出另一种方式来做用一个例子和一些很好的阅读来得到一个没有解释的立即downvote? – karim79 2009-06-19 03:27:43

+0

我不知道,这对我很有用。谢谢 ;) – mrmuggles 2009-06-19 03:33:48

相关问题