代码之家  ›  专栏  ›  技术社区  ›  maček

在PHP函数签名中模拟ruby“splat”运算符的最佳方法[方法重载]

  •  5
  • maček  · 技术社区  · 14 年前

    在露比

    def my_func(foo,bar,*zim)
      [foo, bar, zim].collect(&:inspect)
    end
    
    puts my_func(1,2,3,4,5)
    
    # 1
    # 2
    # [3, 4, 5]
    

    在PHP(5.3)中

    function my_func($foo, $bar, ... ){
      #...
    }
    

    在PHP中,最好的方法是什么?

    2 回复  |  直到 11 年前
        1
  •  7
  •   Gordon Haim Evgi    14 年前

    尝试

    你的Ruby代码段的PHP版本

    function my_func($foo, $bar)
    {
        $arguments = func_get_args();
        return array(
            array_shift($arguments),
            array_shift($arguments),
            $arguments
        );
    }
    print_r( my_func(1,2,3,4,5,6) );
    

    或者只是

    function my_func($foo, $bar)
    {
        return array($foo , $bar , array_slice(func_get_args(), 2));
    }
    

    给予

    Array
    (
        [0] => 1
        [1] => 2
        [2] => Array
            (
                [0] => 3
                [1] => 4
                [2] => 5
                [3] => 6
            )
    )
    

    注意 func_get_args() 将返回传递给函数的所有参数,而不仅仅是那些不在签名中的参数。还要注意,您在签名中定义的任何参数都被认为是必需的,如果它们不存在,PHP将发出警告。

    如果你只想得到 剩下的 参数并确定在运行时,可以使用 ReflectionFunction API 读取签名中的参数个数,并 array_slice 只包含附加参数的完整参数列表,例如

    function my_func($foo, $bar)
    {
        $rf = new ReflectionFunction(__FUNCTION__);
        $splat = array_slice(func_get_args(), $rf->getNumberOfParameters());
        return array($foo, $bar, $splat);
    }
    

    为什么有人会想要这个而不只是使用 函数 我无法忍受,但它会奏效的。更直接的方法是通过以下任何一种方式访问参数:

    echo $foo;
    echo func_get_arg(0); // same as $foo
    $arguments = func_get_args();
    echo $arguments[0]; // same as $foo too
    

    如果需要记录变量函数参数, PHPDoc suggest to use

    /**
     * @param Mixed $foo Required
     * @param Mixed $bar Required
     * @param Mixed, ... Optional Unlimited variable number of arguments
     * @return Array
     */
    

    希望有帮助。

        2
  •  10
  •   Community kfsone    7 年前

    从复制我的答案 another question 与此相关:

    这是现在 possible with PHP 5.6.x ,使用…运算符(也) 在某些语言中称为splat运算符):

    例子:

    function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
    {
        foreach ( $intervals as $interval ) {
            $dt->add( $interval );
        }
        return $dt;
    }