2016-12-06 76 views
0

我在書類中有一個方法display()PHP oop如何調用動態函數名稱

$name = 'display()'; 
$book = new Book('PHP Object-Oriented Solutions', 300); 

$book->$name; 

我如何可以調用使用$book->$name

+0

你嘗試'$書 - > $ name'?錯誤是什麼? – Dragos

+4

我投票結束這個問題,因爲它是PHP手冊的副本。 http://php.net/manual/en/functions.variable-functions.php –

+0

當我使用$書 - > $名稱它說:注意:未定義的屬性:Book :: $ display() –

回答

3

你需要告訴你要執行的方法,而不是變量本身PHP顯示方法,但實際的代碼中:

$name = 'display'; 
$book = new Book('PHP Object-Oriented Solutions', 300); 

$book->$name(); 

正如你所看到的,它將把$name作爲一個屬性名稱,正確的如此...如果你有兩個一個屬性和一個名爲'display'的方法,那麼就沒有辦法disti兩者之間使用你所嘗試過的東西。

+0

是不是要先運行'$ name()'? –

+0

否,詞法分析器看到OOP上下文,並會忽略名爲display()的常規函數​​。 – Narf

+0

是不確定的,有種不能測試:) –

0

最乾淨的方式(IMO至少)是使用類似:

$name = 'display'; 
$book = new Book('PHP Object-Oriented Solutions', 300); 

call_user_func([$book, $name]); // This looks cleaner and/or more obvious on first sight. 
// call_user_func_array([$book, $name], $arrayOfArguments); 

// And as @Narf suggested (and I agree cuz we move forward) 
call_user_func([$book, $name], ... $arrayOfArguments); 

是的,你可以傳遞參數給這個函數,將被傳遞給函數,但你必須後列出它們可調用數組。爲了避免這樣做(難以維護,而且並不總是你想要的),你可以使用call_user_func_array,它接受一個參數數組作爲傳遞給可調用對象的第二個參數。

call_user_func Documentation

call_user_func_array Documentation

+0

參數解包FTW:'call_user_func([$ book,$ name],... $ argsArray);' – Narf

+0

〜Lol,就是說如果我們是拋出窗口5.6(不提及其他人,因爲EOL),但將編輯〜顯然,我笨到忘了他們是5.6功能... * facepalm * –

+0

這是一個PHP 5.6功能。 ;)EOLd版本可以RIP。 – Narf