如何从带有变量的类中调用方法?

How would I call a method from a class with a variable?

提问人:Ryan Florence 提问时间:6/2/2009 更新时间:6/2/2009 访问量:1126

问:

给定这个类:

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 语句。

谢谢!

php oop 变量

评论

1赞 Kekoa 6/2/2009
这可以使用对象来完成,您可以为每个项目设置类,每个项目都可以符合相同的接口,然后有一个 order() 方法,该方法将接受一个 OrderItem 对象,该对象可以是 BurritoOrderItem 或 TacoOrderItem。当需要 Reflection 或有变量方法调用时,我总是畏缩不前,这对我来说并不干净。

答:

3赞 Paolo Bergantino 6/2/2009 #1
$lunch->{'order_' . $myOrder}();

我确实同意设计有点不稳定,但至少是这样做到的。

2赞 kris 6/2/2009 #2

我认为这就是你要找的:call_user_func

https://www.php.net/call_user_func

您可以将您建议的字符串传递给它。请参阅示例 #3 调用类的方法。

5赞 rodion 6/2/2009 #3

像这样的事情怎么样?

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->order('burrito');来称呼它,这对我来说看起来更干净。它把所有的丑陋都放在了 Tacobell::order 方法中。

评论

0赞 Ryan Florence 6/2/2009
到目前为止,所有的答案都是我需要的,但这是我一直在寻找的。谢谢大家。我仍然不确定这是我想要的方式,但就目前而言,它从我的代码中获得了最大的重用率。
0赞 Ozzy 6/2/2009 #4

很简单

$order = 'order_burrito';
$lunch->$order();