我在类中有一些基本上做同样事情的函数:
public function fn_a(){
return __FUNCTION__;
}
public function fn_b(){
return __FUNCTION__;
}
public function fn_c(){
return __FUNCTION__;
}
我需要将这些功能保留在当前名称中,所以我故意做不做:
public function fn_($letter){
return __FUNCTION__.$letter;
}
我希望能在某种程度上缩小代码的冗长程度,因为它们都是这样做的。最终的情况是这样的:
public functions fn_a, fn_b, fn_c() {
return __FUNCTION__;
}
另一种解决方案(如果适用)可能会执行Class的“扩展”:
fn_b, fn_c extend fn_a
?
你觉得怎么样?
答案 0 :(得分:2)
任何类似你建议的语法都是不可能的:如果你想要几个不同的函数,你必须声明所有这些函数。
仍然有可能是你的fn_a,fn_b和fn_c函数只是一个简单的包装器,它们是一个更复杂的包装器:
public function fn_a(){
return fn_all('a');
}
public function fn_b(){
return fn_all('b');
}
public function fn_c(){
return fn_all('c');
}
public function fn_all($name) {
// a lot of complex stuff here
}
这样,当然,根据fn_all
函数的长度,您可以减少代码重复的数量。
另一个想法(不确定如何用方法完成,所以我将用函数演示)将使用Closures - 这意味着PHP> = 5.3
基本的想法是你有第一个函数,它将返回另一个函数 - 它将绑定传递给第一个函数的参数:
首先,创建其他人的功能:
function creator($name) {
return function () use ($name) {
return $name;
};
}
然后,让我们使用该创建者获得三个函数:
$fn_a = creator('a');
$fn_b = creator('b');
$fn_c = creator('c');
现在,调用这三个函数:
echo $fn_a() . '<br />';
echo $fn_b() . '<br />';
echo $fn_c() . '<br />';
我们得到以下输出:
a
b
c
我从不善于解释匿名函数和闭包的工作原理 - 但在谷歌上搜索“闭包”应该有助于你理解;请注意,您可以在Javascript中阅读有关闭包的教程:这个想法完全相同。
(并且,因为关闭是PHP的新功能 - 使用PHP 5.3到达 - 您将找不到与Javascript一样多的教程)
答案 1 :(得分:2)
public function fn_catcher($letter) {
return __FUNCTION__.$letter;
}
public function __call($name) {
if (substr($name, 0, 3) == 'fn_')
{
return $this->fn_catcher($name);
}
}
喜欢那个?