#44139 [Opn]: new ReflectionFunction fails to invoke native functions

From: Date: Mon, 18 Feb 2008 09:46:58 +0000
Subject: #44139 [Opn]: new ReflectionFunction fails to invoke native functions
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-122378@lists.php.net to get a copy of this message
ID: 44139 User updated by: andrea at 3site dot it Reported By: andrea at 3site dot it Status: Open Bug Type: Scripting Engine problem Operating System: Windows XP PHP Version: 5.2.5 New Comment: Sorry, this is what I would like to be able to do: <?php $arr = array(2, 3, 4); $ref = new ReflectionFunction('array_unshift'); $ref->invoke($arr, 1); $ref->invokeArgs(array($arr, 1)); var_dump($arr); exit; ?> Without fatal errors, simply because if send by reference is deprecated, ReflectionFunction (... and I didn't test ReflectionMethod ...) should be able to manage correctly variables by references. This is another Fatal Error example: <?php function unshift(&$arr, $mix){ return array_unshift($arr, $mix); } $arr = array(2, 3, 4); $ref = new ReflectionFunction('unshift'); $ref->invoke($arr, 1); $ref->invokeArgs(array($arr, 1)); var_dump($arr); exit; ?> I hope these examples explain correctly where and what is the problem. Kind Regards Previous Comments: ------------------------------------------------------------------------ [2008-02-18 09:42:17] andrea at 3site dot it Felipe, I'm testing PHP Version 5.2.6-dev and I have the same problem. <?php $arr = array(2, 3, 4); $ref = new ReflectionFunction('array_unshift'); $ref->invoke(&$arr, 1); $ref->invokeArgs(array(&$arr, 1)); var_dump($arr); exit; ?> Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in ... I guess above warning should not exists. So, can you confirm that this is a bug? Cheers ------------------------------------------------------------------------ [2008-02-17 23:41:00] felipe@php.net $ref->invoke(&$arr, 1); $ref->invokeArgs(array(&$arr, 0)); var_dump($arr); // correct and expected result Doesn't show warning on 5.2.6 and 5.3. That was my message. ------------------------------------------------------------------------ [2008-02-17 23:17:39] andrea at 3site dot it Hi Felipe, I don't understand your messages. I know that it generates a Fatal error as I know that send the array forcing reference works as expected but it generates a warning. As I wrote on php.net manual too, to solve this strange behaviour I used a "non-sense" strategy (at least for me) ... $arr = array(2, 3, 4); $ref = new ReflectionFunction('array_unshift'); $ref->invokeArgs(array_merge(array(&$arr), array(1))); $ref->invokeArgs(array_merge(array(&$arr), array(0))); // $arr == [0,1,2,3,4] I can't understand why one single value is accepted by reference inside an array while more than one is not accepted. Since PHP 5 should manage by itself references I think that ReflectionFunction should do the same, without reference requirement but working as expected. Do you think am I wrong? Kind Regards ------------------------------------------------------------------------ [2008-02-17 19:45:57] felipe@php.net Ops... 5_3 also issued 'Fatal error'. Warning: Parameter 1 to array_unshift() expected to be a reference, value given in %s on line %d Fatal error: Uncaught exception 'ReflectionException' with message 'Invocation of function array_unshift() failed' in %s:%d Stack trace: #0 %s(19): ReflectionFunction->invoke(Array, 1) #1 {main} thrown in %s on line %d ------------------------------------------------------------------------ [2008-02-17 19:40:54] felipe@php.net PHP 5.2.6: $ref->invoke($arr, 1); Fatal error: Uncaught exception 'ReflectionException' with message 'Invocation of function array_unshift() failed' $ref->invokeArgs(array($arr, 0)); Fatal error: Uncaught exception 'ReflectionException' with message 'Invocation of function array_unshift() failed' PHP 5.3.0: $ref->invoke($arr, 1); and $ref->invokeArgs(array($arr, 0)); Warning: Parameter 1 to array_unshift() expected to be a reference, value given ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/44139 -- Edit this bug report at http://bugs.php.net/?id=44139&edit=1

« previous php.bugs (#122378) next »