Самый простой тест-кейс:
<?
function foo($arg) {}
$rf = new ReflectionFunction("foo");
runkit_function_remove("foo");
$rf->invokeArgs(array("test"));
?>
Вариация на тему:
<?
function foo($arg) {}
$rf = new ReflectionFunction("foo");
runkit_function_redefine("foo", '$arg1', 'var_dump("new implementation - $arg1");');
$rf->invokeArgs(array("test"));
?>
Чуть сложнее:
<?
function foo($arg) {}
$rp = new ReflectionParameter("foo", "arg");
runkit_function_redefine("foo", '$arg1', 'var_dump("new implementation - $arg1");');
var_dump($rp->getDeclaringFunction());
var_dump((string)$rp);
?>
Всё, в общем, логично - reflection хранит старый указатель, а runkit ему делает free (верней, zend_hash_update()) и подменяет его другим.
Самый простой тест-кейс: <? function foo($arg) {} $rf = new ReflectionFunction("foo"); runkit_function_remove("foo"); $rf->invokeArgs(array("test")); ?>
Вариация на тему: <? function foo($arg) {} $rf = new ReflectionFunction("foo"); runkit_function_redefine("foo", '$arg1', 'var_dump("new implementation - $arg1");'); $rf->invokeArgs(array("test")); ?>
Чуть сложнее: <? function foo($arg) {} $rp = new ReflectionParameter("foo", "arg"); runkit_function_redefine("foo", '$arg1', 'var_dump("new implementation - $arg1");'); var_dump($rp->getDeclaringFunction()); var_dump((string)$rp); ?>
Всё, в общем, логично - reflection хранит старый указатель, а runkit ему делает free (верней, zend_hash_update()) и подменяет его другим.