2009-06-19 96 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

相關問題