Лучший способ эмулировать Ruby-оператор "splat" в сигнатурах функций PHP - PullRequest
5 голосов
/ 26 августа 2010

в рубине

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 ]

10 голосов
/ 27 января 2014

Копирование моего ответа из другого вопроса , относящегося к этому:

Это теперь возможно с PHP 5.6.x , используя оператор ... (также в некоторых языках оператор сплат):

Пример:

function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
{
    foreach ( $intervals as $interval ) {
        $dt->add( $interval );
    }
    return $dt;
}
7 голосов
/ 26 августа 2010

Попробуйте

  • func_get_args - Возвращает массив, содержащий список аргументов функции

PHP-версия вашего Ruby Snippet

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

Почему кто-то хотел бы, чтобы просто с помощью func_get_args() я не знал, но это сработает. Более простым является доступ к аргументам любым из следующих способов:

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

Если вам нужно документировать аргументы переменных функций, PHPDoc предлагает использовать

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

Надеюсь, это поможет.

...