我需要在一个类中定义几个方法。这些方法非常相似,所以我想创建一个方法名称数组,然后从这个名称数组中生成所有方法。我不需要调用这些方法,只需定义它们以便它们可以在其他地方调用。
我不一定喜欢我必须以这种方式定义这些方法,但方法名称是一成不变的。
这样的事情可能是:
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
}
}
}
}
答案 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
}
}
感谢神奇的方法参考。