1

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

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

你们觉得怎么样?

4

2 回答 2

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函数的长度,当然,你会减少代码重复的数量。



另一个想法(不确定如何使用方法来完成,所以我将使用函数进行演示)是使用闭包——这意味着 PHP >= 5.3

基本思想是你有一个第一个函数,它会返回另一个函数——它将绑定传递给第一个函数的参数:

首先,创建其他函数的函数:

function creator($name) {
    return function () use ($name) {
        return $name;
    };
}

然后,让我们获得三个函数,使用该创建者 one :

$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 一样多的教程)

于 2010-03-26T22:51:47.347 回答
2
public function fn_catcher($letter) {
        return __FUNCTION__.$letter;
}

public function __call($name) {
        if (substr($name, 0, 3) == 'fn_')
        {
              return $this->fn_catcher($name);
        }
}

像那样?

于 2010-03-26T22:52:10.250 回答