답변:
배열에 인수가있는 경우 call_user_func_array
함수에 관심이있을 수 있습니다 .
전달하려는 인수의 수가 배열의 길이에 따라 달라진다면 아마도 배열 자체로 압축하여의 두 번째 매개 변수에 사용할 수 있음을 의미 할 것입니다 call_user_func_array
.
전달한 배열의 요소는 함수에서 고유 한 매개 변수로 수신됩니다.
예를 들어이 기능이있는 경우 :
function test() {
var_dump(func_num_args());
var_dump(func_get_args());
}
다음과 같이 매개 변수를 배열로 압축 할 수 있습니다.
$params = array(
10,
'glop',
'test',
);
그런 다음 함수를 호출합니다.
call_user_func_array('test', $params);
이 코드는 다음을 출력합니다.
int 3
array
0 => int 10
1 => string 'glop' (length=4)
2 => string 'test' (length=4)
즉, 3 개의 매개 변수; iof 함수가 다음과 같이 호출 된 것과 똑같습니다.
test(10, 'glop', 'test');
이제 ... 연산자 (일부 언어에서는 splat 연산자라고도 함)를 사용하여 PHP 5.6.x 에서 가능합니다 .
예:
function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
{
foreach ( $intervals as $interval ) {
$dt->add( $interval );
}
return $dt;
}
addDateIntervaslToDateTime( new DateTime, new DateInterval( 'P1D' ),
new DateInterval( 'P4D' ), new DateInterval( 'P10D' ) );
PHP 5.6 부터는 변수 인자 목록을 ...
연산자 로 지정할 수 있습니다 .
function do_something($first, ...$all_the_others)
{
var_dump($first);
var_dump($all_the_others);
}
do_something('this goes in first', 2, 3, 4, 5);
#> string(18) "this goes in first"
#>
#> array(4) {
#> [0]=>
#> int(2)
#> [1]=>
#> int(3)
#> [2]=>
#> int(4)
#> [3]=>
#> int(5)
#> }
보시다시피 ...
연산자는 배열에서 인수의 변수 목록을 수집합니다.
변수 인수를 다른 함수에 전달해야하는 경우 ...
에도는 여전히 도움이 될 수 있습니다.
function do_something($first, ...$all_the_others)
{
do_something_else($first, ...$all_the_others);
// Which is translated to:
// do_something_else('this goes in first', 2, 3, 4, 5);
}
PHP 7 부터 , 인자의 변수 목록도 모두 같은 유형이 되도록 강제 할 수 있습니다.
function do_something($first, int ...$all_the_others) { /**/ }
이 작업을 수행하는 방법을 찾는 사람들을 위해 $object->method
:
call_user_func_array(array($object, 'method_name'), $array);
변수 매개 변수를 사용하여 변수 method_name을 호출하는 구성 함수에서 성공했습니다.
$object->method_name(...$array);
$object->method_name(&...$args);
그냥 부를 수 있습니다.
function test(){
print_r(func_get_args());
}
test("blah");
test("blah","blah");
산출:
어레이 ([0] => blah) 어레이 ([0] => blah [1] => blah)
여기 아무도 단순히 배열을 전달하고 추출 하는 것에 대해 언급하지 않은 것에 놀랐습니다 . 예 :
function add($arr){
extract($arr, EXTR_REFS);
return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact('one', 'two')); // 3
물론 이것은 인수 유효성 검사를 제공하지 않습니다 . 이를 위해 누구나 내 기대 기능을 사용할 수 있습니다 : https://gist.github.com/iautomation/8063fc78e9508ed427d5
오래된 질문이지만 여기에있는 답변 중 어느 것도 단순히 질문에 대한 답변을 제대로 수행하지 못합니다.
방금 PHP로 놀았고 해결책은 다음과 같습니다.
function myFunction($requiredArgument, $optionalArgument = "default"){
echo $requiredArgument . $optionalArgument;
}
이 함수는 두 가지 작업을 수행 할 수 있습니다.
필수 매개 변수 만 사용하여 호출하는 경우 : myFunction("Hi")
"Hi default"를 인쇄합니다.
그러나 선택적 매개 변수로 호출 myFunction("Hi","me")
하면 "Hi me"가 인쇄됩니다.
나는 이것이 길 아래에서 이것을 찾는 모든 사람에게 도움이되기를 바랍니다.
다음은 매직 메서드 __invoke를 사용하는 솔루션입니다.
(php 5.3부터 사용 가능)
class Foo {
public function __invoke($method=null, $args=[]){
if($method){
return call_user_func_array([$this, $method], $args);
}
return false;
}
public function methodName($arg1, $arg2, $arg3){
}
}
같은 클래스 내부에서 :
$this('methodName', ['arg1', 'arg2', 'arg3']);
개체의 인스턴스에서 :
$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])
call_user_func_array
2009 년 최우수 투표 답변에서 언급 한대로 사용 하고 있습니다. 아마도 그 __invoke
주위를 추가로 감싸 야 할 요점이있을 수 있습니다. 그러나 나는 그것을 보지 못합니다.