代码之家  ›  专栏  ›  技术社区  ›  Gal

我可以用相同的内容,不同的名称集成函数吗?

  •  1
  • Gal  · 技术社区  · 16 年前

    我在一个类中有几个函数,它们基本上做相同的事情:

    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__;
    }
    

    fn_b, fn_c extend fn_a ?

    你们觉得怎么样?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Pascal MARTIN    16 年前

    任何类似您建议的语法都是不可能的:如果您想要几个不同的函数,您必须声明所有这些函数。

    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;
        };
    }
    

    $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中是新出现的—随PHP5.3一起出现—您将找不到像Javascript那样多的教程)

        2
  •  2
  •   Amy B    16 年前
    public function fn_catcher($letter) {
            return __FUNCTION__.$letter;
    }
    
    public function __call($name) {
            if (substr($name, 0, 3) == 'fn_')
            {
                  return $this->fn_catcher($name);
            }
    }
    

    推荐文章