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


148

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

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

답변:


178

1
접두사 문자와 같은 기능이 아니라고 맹세 할 수있었습니다. 감사.
Robert K

8
그러나 나는 파이썬을 모른다! 나는 우연히 정신적이어야한다 ... : D
Robert K

45
인자 압축 해제는 PHP 5.6 ( wiki.php.net/rfc/argument_unpacking )에 추가 될 예정 입니다. 'splat operator': '...'를 사용합니다. 구문 : $args = [1,2,3]; function(...$args){}
arothuis

4
그러나 호출하려는 함수가 전역 공간의 함수 이름이 아닌 객체의 인스턴스 메소드 인 경우 어떻게해야합니까?
ahnbizcad

6
@ahnbizcad 에서는 첫 번째 요소가 객체이고 두 번째가 메소드 인 배열에서만 callablesame을 사용해야합니다 call_user_func_array. 예를 들어call_user_func_array([$object, 'method'], $myArgs);
SteveB

149

언급 한 바와 같이 , 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);

7
이것보다 성능이 크게 향상되었습니다 call_user_func_array. 따라서 PHP 5.6 이상을 사용하는 경우 이것을 권장합니다. 여기에 테스트입니다 에 인용 된, PHP 공식 위키
CarlosCarucce

2
이것은 불행히도 이것이 표시된 답변이 아닙니다. 확실히 더 나아졌다
용서받지 않은 1987

81

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

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

4
@understack 링크 된 페이지$foo->bar()예는이 페이지 가되어야한다고 제안합니다 array($instance, "MethodName").
Paul Calcraft

11
놀랍게도, 나는 이것을 자식 클래스에서 생성자 인수가 중복되는 것을 피하기 위해 사용했습니다 :)call_user_func_array(array(parent, "__construct"), func_get_args());
Jason

10

완전성을 위해 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를 대신 사용하고 객체를 첫 번째 매개 변수로 전달합니다.


이것은 실제로 내가 찾던 것입니다!
Dejv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.