Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“模仿Ruby的最佳方式”;splat";PHP函数签名中的运算符[方法重载] 红宝石色 在PHP中(5.3)_Php_Ruby_Overloading - Fatal编程技术网

“模仿Ruby的最佳方式”;splat";PHP函数签名中的运算符[方法重载] 红宝石色 在PHP中(5.3)

“模仿Ruby的最佳方式”;splat";PHP函数签名中的运算符[方法重载] 红宝石色 在PHP中(5.3),php,ruby,overloading,Php,Ruby,Overloading,在PHP中实现这一点的最佳方法是什么?试试看 -返回包含函数参数列表的数组 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,

在PHP中实现这一点的最佳方法是什么?

试试看

  • -返回包含函数参数列表的数组
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));
}
给予

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

如果您只想获取剩余的参数并在运行时确定,则可以使用读取签名中的参数数量,并使用完整的参数列表仅包含其他参数,例如

function my_func($foo, $bar)
{
    $rf = new ReflectionFunction(__FUNCTION__);
    $splat = array_slice(func_get_args(), $rf->getNumberOfParameters());
    return array($foo, $bar, $splat);
}
我无法理解为什么有人仅仅使用
func\u get\u args()
就想这么做,但这是可行的。更直接的方法是通过以下任何一种方式访问参数:

echo $foo;
echo func_get_arg(0); // same as $foo
$arguments = func_get_args();
echo $arguments[0]; // same as $foo too
如果需要记录变量函数参数

希望对您有所帮助。

复制我的答案与此相关:

这是现在,使用。。。接线员(也是 在某些语言中称为splat运算符):

例如:

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

看看func_get_args()Gordon,splat将所有重载参数收集到一个数组中。我担心PHP将不得不自投罗网才能获得这种类型的功能…函数定义中甚至不需要$foo和$bar,除了用于“文档”目的之外-函数my_func()就足够了-尽管如果函数定义中有$foo和$bar,它们可以在函数代码中被引用。@macek,PHP没有只收集重载参数的功能,但是
func_get_args
将包含传递给函数的任何参数,这些参数与函数的签名无关。在上述函数中,
$foo
$bar
生成这两个必需参数。如果不提供它们,PHP将引发错误。在函数内部,
$foo is func_get_arg(0)is func_get_args()[0]
@macek只需使用类似list($foo,$baz,$baz)=array()的方法将结果数组拆分为所需的变量。另外,如果你不在别人选择的平台上乱扔东西,你肯定会得到更多有用的答案。@Alan,我不是有意乱扔PHP;我一直在用它。PHP不太适合元编程。
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
/**
 * @param Mixed $foo Required
 * @param Mixed $bar Required
 * @param Mixed, ... Optional Unlimited variable number of arguments
 * @return Array
 */
function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
{
    foreach ( $intervals as $interval ) {
        $dt->add( $interval );
    }
    return $dt;
}