#44139 [Opn->Fbk]: Fatal error with ReflectionFunction and ReflectionMethod using reference
| From: | jani@php.net | Date: | Thu, 17 Jul 2008 23:23:23 +0000 |
| Subject: | #44139 [Opn->Fbk]: Fatal error with ReflectionFunction and ReflectionMethod using reference | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-126919@lists.php.net to get a copy of this message | ||
ID: 44139
Updated by: jani@php.net
Reported By: andrea at 3site dot it
-Status: Open
+Status: Feedback
Bug Type: Scripting Engine problem
Operating System: Windows XP
PHP Version: 5.2.6
New Comment:
Please try using this CVS snapshot:
http://snaps.php.net/php5.2-latest.tar.gz
For Windows (zip):
http://snaps.php.net/win32/php5.2-win32-latest.zip
For Windows (installer):
http://snaps.php.net/win32/php5.2-win32-installer-latest.msi
Previous Comments:
------------------------------------------------------------------------
[2008-02-18 11:33:43] andrea at 3site dot it
As expected, this problem is present on ReflectionMethod too.
Basically, the summary of this bug is wrong and I guess that correct
could be the changed one.
I tested both problems in PHP 5.2.5 and 5.2.6-dev.
This example shows the problem using methods as well.
<?php
class Test{
public function unshift(&$arr, $mix){
return array_unshift($arr, $mix);
}
}
$instance = new Test;
$arr = array(2, 3, 4);
$ref = new ReflectionMethod('Test', 'unshift');
// WARNING
$ref->invoke($instance, &$arr, 1);
$ref->invokeArgs($instance, array(&$arr, 0));
var_dump($arr); // [0,1,2,3,4]
// FATAL ERROR
$ref->invoke($instance, $arr, 1);
$ref->invokeArgs($instance, array($arr, 0));
var_dump($arr);
exit;
?>
Thanks for solving this problem.
Kind Regards.
------------------------------------------------------------------------
[2008-02-18 09:46:58] andrea at 3site dot it
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
------------------------------------------------------------------------
[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
------------------------------------------------------------------------
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