PHP에는 배열을 표준 func($arg1, $arg2)
방식으로 역 참조하여 함수의 인수 목록으로 배열을 전달하는 방법이 있다는 것을 기억합니다 . 그러나 지금 나는 그것을하는 방법에 빠져 있습니다. 참조로 전달하는 방식, 들어오는 매개 변수를 “글로브”하는 방법을 기억하지만 배열을 인수 목록으로 나열 해제하는 방법은 기억하지 않습니다.
그것은만큼 간단 할 수도 func(&$myArgs)
있지만 그렇지는 않습니다. 그러나 슬프게도 php.net 매뉴얼은 지금까지 아무것도 공개하지 않았습니다. 지난 몇 년 동안이 특정 기능을 사용해야했던 것은 아닙니다.
답변
http://www.php.net/manual/en/function.call-user-func-array.php
call_user_func_array('func',$myArgs);
답변
언급 한 바와 같이 , 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를 대신 사용하고 객체를 첫 번째 매개 변수로 전달합니다.