ReflectionFunction::invokeArgs

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionFunction::invokeArgsInvokes function args

Опис

public function ReflectionFunction::invokeArgs(array $args): mixed

Invokes the function and pass its arguments as array.

Параметри

args

The parameters to be passed to the function, as an array, much like call_user_func_array() works.

If the keys of args are all numeric, the keys are ignored and each element is passed to the function as a positional argument, in order.

If any keys of args are strings, those elements are passed to the function as named arguments, with the name given by the key.

An Error is thrown if a numeric key in args appears after a string key, or if a string key does not match the name of any parameter of the function.

Значення, що повертаються

Returns the result of the invoked function

Журнал змін

Версія Опис
8.0.0 args keys will now be interpreted as parameter names, instead of being silently ignored.

Приклади

Приклад #1 ReflectionFunction::invokeArgs() example

<?php
function title($title, $name)
{
    return sprintf("%s. %s\r\n", $title, $name);
}

$function = new ReflectionFunction('title');

echo $function->invokeArgs(array('Dr', 'Phil'));
?>

Поданий вище приклад виведе:

Dr. Phil

Приклад #2 ReflectionFunction::invokeArgs() with references example

<?php
function get_false_conditions(array $conditions, array &$false_conditions)
{
    foreach ($conditions as $condition) {
        if (!$condition) {
            $false_conditions[] = $condition;
        }
    }
}

$function_ref     = new ReflectionFunction('get_false_conditions');

$conditions       = array(true, false, -1, 0, 1);
$false_conditions = array();

$function_ref->invokeArgs(array($conditions, &$false_conditions));

var_dump($false_conditions);
?>

Поданий вище приклад виведе:

array(2) {
  [0]=>
  bool(false)
  [1]=>
  int(0)
}

Примітки

Зауваження:

У переданому списку параметрів мають бути посилання, якщо функція очікує параметри-посилання.

Прогляньте також

add a note

User Contributed Notes 2 notes

up
0
theyourcomputer at gmail dot com
8 years ago
In the case of call_user_func_array(), if you were to pass around an anonymous function and reference $this within the anonymous function, $this will faithfully refer to the class in the context in which the function was defined. Using ReflectionFunction::invokeArgs() does not seem to retain its original context--yeah, even if you bind the anonymous function before invoking. I recommend call_user_func_array() where context is a concern.
up
0
Andrea Giammarchi
18 years ago
I encountered a weird problem with ReflectionFunction, described in ticket 44139 of PHP Bugs.

If for some reason you need to call with invoke, or invokeArgs, a function like array_unshift (that accepts internally the array by reference) you could use this code to avoid the generated warning or fatal error.

<?php
function unshift(){
    $ref        = new ReflectionFunction('array_unshift');
    $arguments    = func_get_args();
    return        $ref->invokeArgs(array_merge(array(&$this->arr), $arguments));
}
?>

I don't know about performances (you can create an array manually too, starting from array(&$this->something) and adding arguments). However, it seems to work correctly without problems, at least until the send by reference will be usable with one single value ...