[php] PHP에서 배열을 인수가 아닌 인수로 전달

PHP에는 배열을 표준 func($arg1, $arg2)방식으로 역 참조하여 함수의 인수 목록으로 배열을 전달하는 방법이 있다는 것을 기억합니다 . 그러나 지금 나는 그것을하는 방법에 빠져 있습니다. 참조로 전달하는 방식, 들어오는 매개 변수를 “글로브”하는 방법을 기억하지만 배열을 인수 목록으로 나열 해제하는 방법은 기억하지 않습니다.

그것은만큼 간단 할 수도 func(&$myArgs)있지만 그렇지는 않습니다. 그러나 슬프게도 php.net 매뉴얼은 지금까지 아무것도 공개하지 않았습니다. 지난 몇 년 동안이 특정 기능을 사용해야했던 것은 아닙니다.



답변


답변

언급 한 바와 같이 , PHP 5.6+부터는 ...토큰 ( 가변 함수 기능의 일부인 “스 플랫 연산자” )을 사용하여 인수 배열로 함수를 쉽게 호출 할 수 있습니다.

<?php
function variadic($arg1, $arg2)
{
    // Do stuff
    echo $arg1.' '.$arg2;
}

$array = ['Hello', 'World'];

// 'Splat' the $array in the function call
variadic(...$array);

// 'Hello World'

참고 : 배열 항목은 키가 아닌 배열 위치 에 따라 인수에 매핑됩니다 .

당으로 CarlosCarucce의 코멘트 , 인수 풀기의 형태는 지금까지 가장 빠른 방법입니다 모든 경우에는. 일부 비교에서는 call_user_func_array. 보다 5 배 이상 빠릅니다 .

곁에

이것이 실제로 유용하다고 생각하기 때문에 (질문과 직접 ​​관련이 없지만) : splat 연산자 매개 변수를 입력 할 수 있습니다 전달 된 모든 값이 특정 유형과 일치하도록 함수 정의에 를 .

(그냥 이렇게하는 것이 기억 해야마지막으로 사용자가 정의하는 매개 변수 그리고 그것은 배열 함수에 전달 된 모든 매개 변수를 번들 있음.)

배열에 특정 유형의 항목이 포함되어 있는지 확인하는 데 좋습니다.

<?php

// Define the function...

function variadic($var, SomeClass ...$items)
{
    // $items will be an array of objects of type `SomeClass`
}

// Then you can call...

variadic('Hello', new SomeClass, new SomeClass);

// or even splat both ways

$items = [
    new SomeClass,
    new SomeClass,
];

variadic('Hello', ...$items);


답변

또한 인스턴스 메소드를 배열에 적용하려면 함수를 다음과 같이 전달해야합니다.

call_user_func_array(array($instance, "MethodName"), $myArgs);


답변

완전성을 위해 PHP 5.1부터는 다음과 같이 작동합니다.

<?php
function title($title, $name) {
    return sprintf("%s. %s\r\n", $title, $name);
}
$function = new ReflectionFunction('title');
$myArray = array('Dr', 'Phil');
echo $function->invokeArgs($myArray);  // prints "Dr. Phil"
?>

참조 : http://php.net/reflectionfunction.invokeargs

메서드의 경우 ReflectionMethod :: invokeArgs를 대신 사용하고 객체를 첫 번째 매개 변수로 전달합니다.


답변