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 ...
ReflectionFunction::invokeArgs
(PHP 5 >= 5.1.0)
ReflectionFunction::invokeArgs — Invokes function args
Beschreibung
Invokes the function and pass its arguments as array.
Parameter-Liste
-
args -
The passed arguments to the function as an array, much like call_user_func_array() works.
Rückgabewerte
Returns the result of the invoked function
Beispiele
Beispiel #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'));
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Dr. Phil
Beispiel #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);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
array(2) {
[0]=>
bool(false)
[1]=>
int(0)
}
Anmerkungen
Hinweis:
Wenn die Funktion einige Argumente per Referenz akzeptiert, so müssen diese als Referenzen in die Argument-Liste gegeben werden.
Siehe auch
- ReflectionFunction::invoke() - Invokes function
- ReflectionFunctionAbstract::getNumberOfParameters() - Gets number of parameters
- __invoke()
- call_user_func_array() - Call a callback with an array of parameters
Andrea Giammarchi ¶
5 years ago
