2009-06-01 40 views
2

鑑於這種類:我將如何從一個變量的類調用方法?

class Tacobell{ 

    public function order_taco(){ 
     echo "3 Tacos, thank you."; 
    } 

    public function order_burrito(){ 
     echo "Cheesy bean and rice, please"; 
    } 

} 

$lunch = new Tacobell; 
$lunch->order_burrito(); 
$lunch->order_taco(); 

我怎麼會做這樣的事?

$myOrder = 'burrito'; 
$lunch->order_.$myOrder; 

很明顯,代碼是雙層 - 但顯示了我試圖做的比嘗試解釋它更好。

也許我正在討論這一切都是錯誤的。我想到了一個使用switch語句的方法,通過了墨西哥捲餅或塔科,然後從那裏調用正確的方法。但是,我必須從一開始就知道結束,而且我可能有很多方法,我寧願不必每次都更新switch語句。

謝謝!

+1

這可以使用對象來完成,你可以爲每個項目類別,每個人都可以遵循相同的接口,然後有將採取OrderItem的對象的單個訂單()方法,可以是BurritoOrderItem或TacoOrderItem。當需要反射或者當你有可變的方法調用時,我總是畏縮,它對我來說並不乾淨。 – Kekoa 2009-06-01 21:33:57

回答

5

這樣的事情呢?

class Tacobell { 
    public function order_burrito() { 
     echo "Bladibla.\n"; 
    } 

    public function order($item) { 
     if (method_exists($this, "order_$item")) { 
      $this->{'order_' . $item}(); 
     } else { 
      echo "Go away, we don't serve $item here.\n"; 
     } 
    } 
} 

你會使用$ lunch->訂單( '捲餅');,它看起來清爽多了給我打電話吧。它將Tacobell :: order方法中的所有醜陋行爲都考慮進去了。

+0

到目前爲止所有的答案都是我所需要的,但這正是我所需要的。謝謝大家。我仍然不確定這是怎麼做的,但現在它得到了我的代碼中最多的重用。 – 2009-06-01 23:30:18

3
$lunch->{'order_' . $myOrder}(); 

我不同意的設計是有點玄乎,但這是如何至少做到這一點。

0

足夠簡單

$order = 'order_burrito'; 
$lunch->$order(); 
相關問題