php - 我可以集成具有相同内容,不同名称的函数吗?

时间:2010-03-26 22:49:06

标签: php function names

我在类中有一些基本上做同样事情的函数:

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

你觉得怎么样?

2 个答案:

答案 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);
        }
}

喜欢那个?