如何使用變數執行 method?
傳統我們會使用 if else 判斷,執行不同的 method,但由於 JavaScript 與 PHP 動態語言的特性,我們可以將要執行的 method 名稱以變數表示,直接以該變數執行 method。
Version
ECMAScript 5
PHP 7.0
JavaScript
if else
傳統若要根據不同的 property 值,執行不同 method,我們會使用 if else方式 :1 1GitHub Commit : JavaScript : 傳統使用 if else 切換 method
1  | function User(showed) {  | 
第 4 行1
2
3
4
5
6
7this.toggleShow = function() {
    if (this.showed) {
        this.show();
    } else {
        this.hide();
    } 
};
使用 if else 去判斷 property 值,執行不同 method。
Variable
若將 method 名稱使用變數表示,則不需使用 if else 判斷 :2 2GitHub Commit : JavaScript : 動態使用變數切換 method
1  | function User(showed) {  | 
第 4 行1
2
3
4this.toggleShow = function() {
    var methodName = (this.showed) ? 'show' : 'hide';
    this[methodName]();
};
判斷 this.showed,並將要執行的 method 名稱存入 methodName 變數。
在 JavaScript,若要執行物件的 method,有以下3種方式 :
- object.method()
 - object[‘method’] () : 其中 ‘method’ 是字串。
 - object[method] () : 其中 method 是變數。
 
因為第 3 種方式,我們可以將 method 名稱以變數方式傳入 []。
PHP
PHP 也可以達到類似 JavaScript 的功能。
if else
傳統若要根據不同的 field 值,執行不同 method,我們會使用 if else方式 :3 3GitHub Commit : PHP : 傳統使用 if else 切換 method
1  | class User  | 
第 10 行1
2
3
4
5
6
7
8public function toggleShow()
{
    if ($this->showed) {
        $$this->show();
    } else {
        $this->hide();
    }
}
使用 if else 去判斷 field 值,執行不同 method。
Variable
若將 method 名稱使用變數表示,則不需使用 if else判斷 :4 4GitHub Commit : PHP : 動態使用變數切換 method
1  | class User  | 
第 10 行1
2
3
4
5public function toggleShow()
{
    $method = ($this->showed) ? 'show' : 'hide';
    $this->$method();
}
判斷 $this->showed,並將要執行的 method 名稱存入 $method 變數。
在 PHP,允許我們在 -> 之後直接加上變數與(),代表要執行的 method。
Conclusion
- JavaScript 與 PHP 都允許我們將欲執行的 method 名稱以變數表示。
 - 因為 method 名稱是字串,所以我們可以將 method 名稱存在設定檔內,如 
config/app.php,將來若因為需求改變,須改變執行的 method 時,只需修改設定檔即可,並透過config::get()讀取 method 名稱,原來程式碼完全不用修改,達到開放封閉原則的要求。 
Sample Code
完整的範例可以在我的 GitHub 上找到。