我如何定义PHP类中的方法数组?

时间:2015-10-10 13:29:50

标签: php methods

我需要在一个类中定义几个方法。这些方法非常相似,所以我想创建一个方法名称数组,然后从这个名称数组中生成所有方法。我不需要调用这些方法,只需定义它们以便它们可以在其他地方调用。

我不一定喜欢我必须以这种方式定义这些方法,但方法名称是一成不变的。

这样的事情可能是:

class ProjectController
{
    public function __construct()
    {
        $this->makeMethods();
    }

    public function makeMethods()
    {
        $methods = ['Documents', 'Addenda', 'Docreleases', 'Drawings'];

        foreach($methods as $m){
            $method_name = 'get' . $m;

            /*
             * Define a method named $method_name on ProjectController
             * (I know the statement below is wrong. How might I fix it? I'm almost certain that I'm using '$this' incorrectly here, but I'm not sure what to use. '$this' should be a reference to ProjectController.)
             */

            $this->$method_name = function(){
                // do something
            }

        }
    }
}

2 个答案:

答案 0 :(得分:2)

这正是__get()魔术方法的用途。无需为所有存在的变量类成员提供getter。只需动态获取它们。

public function __get($var) 
{
    return $this->$var;
}

答案 1 :(得分:0)

正如我所说,方法名称是一成不变的。我不是只想为属性定义getter,我正在尝试使用Laravel http://laravel.com/docs/5.1/controllers#implicit-controllers为隐式控制器定义路由。

我最终这样做了:

public function __call($method, $args) {
    $action = substr($method, 0, 3);
    $resources = ['Documents', 'Addenda', 'Docreleases', 'Drawings'];
    $resource = substr($method, 3);

    if($action == 'get' && in_array($resource, $resources)){
        // do something
    }
}

感谢神奇的方法参考。