如何动态调用以给定前缀开头的所有实例方法?

时间:2017-07-21 18:53:41

标签: php oop dynamic

我有一个类,我想动态调用所有以默认名称开头的函数:

class social_button
{
     public function __construct()
     {
         [...]
     }

     private function social_facebook()
     {[...]}

     private function social_instagramm();
     {[...]}

     private function social_twitter();
     {[...]}

     [and so on]
}

我的问题是,我不会写所有的时间:

$this->social_facebook();
$this->social_twitter();
...

因为它可能/将成为无穷无尽的名单。

所以这是我的问题:

有没有办法将所有功能称为通用/动态,以" social"?开头 喜欢:$this->social_*();

(" *"类似占位符,包含无限数量的字符)

抱歉我的英语不好,非常感谢所有答案。

祝你好运

2 个答案:

答案 0 :(得分:4)

您可以使用字符串连接构建方法名称:

$service = 'facebook';
$this->{'social_' . $service}();

$service = 'social_facebook';
$this->$service();

如果你想打电话给所有人,请选择:

$services = ['facebook', 'twitter'];
foreach ($services as $service) {
  $this->{'social_' . $service}();
}

答案 1 :(得分:1)

修改:请参阅下面的the answer by localheinz了解更好的方法,使用反射。 get_class_methods()只返回公开方法。

建立 hsz 的答案:

您可以获取课程列表'使用get_class_methods()的方法。然后你可以遍历结果,如果它以" social _"开头,则调用该方法。

// Get the list of methods
$class_methods = get_class_methods("social_button");

// Loop through the list of method names
foreach ($class_methods as $method_name)
{
    // Are the first 7 characters "social_"?
    if (substr($method_name, 0, 7) == "social_")
    {
        // Call the method
        $this->{$method_name}();
    }
}