2013-03-30 16 views
0

對於函數,我只能將函數名稱分配給字符串變量,但是如何爲類方法執行此操作?指向方法的變量函數名稱

$func = array($this, 'to' . ucfirst($this->format)); 
$func(); // fails in PHP 5.3 

這似乎工作:

$this->{"to{$this->format}"}(); 

但它是太長了我。我需要多次調用此函數...

+0

您能否澄清一下您試圖調用的成員函數以及如何在不使用變量的情況下調用它?很難說出什麼是功能名稱和/或基於你的問題是否有任何參數。 – Aiias

+0

我試圖訪問一個非靜態類的方法,例如。 '$ this-> toHtml()' –

回答

1

一個選項是使用php的call_user_func_array();

例子:

call_user_func_array(array($this, 'to' . ucfirst($this->format)), array()); 

您也可以使用self關鍵字或與scope resolution operator類名。

例子:

$name = 'to' . ucfirst($this->format); 
self::$name(); 

className::$name(); 

但是,你必須使用PHP的variable functions也是完全有效的發佈內容:

$this->{"to{$this->format}"}(); 

call_user_func_array()大概被認爲比使用變量函數的可讀性,但是從我讀過(如here),可變函數傾向於執行call_user_func_array()

你是什麼意思由變量函數太長

1

這不是一個真正的函數嗎?爲什麼不使用標準方法進行功能?

function func() { 
$func = array($this, 'to' . ucfirst($this->format)); 
return $func; 
} 

後輸出與

func(); 
+0

任何變量字符串都可以作爲函數調用。看看php [變量函數](http://php.net/manual/en/functions.variable-functions.php)文檔。 – Aiias

+0

對不起,但根據示例,調用一個變量字符串作爲函數應該這樣做:function func(){bblabla} $ variable ='func'; $ variable()=> so $ variable()調用func() –

1

您可以使用call_user_func

class A 
{ 

    function thisIsAwesome() 
    { 
    return 'Hello'; 
    } 

} 

$a = new A; 

$awesome = 'IsAwesome'; 

echo call_user_func(array($a, 'this' . $awesome)); 

雖然它仍然是相當長的。你可以編寫自己的功能來做到這一點:

function call_method($a, $b) 
{ 
    return $a->$b(); 
} 

$a = new A; 

$awesome = 'IsAwesome'; 

echo call_method($a, 'this' . $awesome); 

這是一個較短的垃圾。