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:

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


Previous Comments:
------------------------------------------------------------------------

[2008-02-17 23:41:00] [EMAIL PROTECTED]

$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] [EMAIL PROTECTED]

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] [EMAIL PROTECTED]

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



------------------------------------------------------------------------

[2008-02-17 00:06:41] andrea at 3site dot it

Description:
------------
For some reason, ReflectionFunction doesn't allow me to to invoke a
basic function like, for example, array_unshift.

Reproduce code:
---------------
$arr = array(2, 3, 4);

/** EXPECTED RESULT
 * array_unshift($arr, 1);
 * array_unshift($arr, 0);
 * var_dump($arr);      // 0, 1, 2, 3, 4
 */

$ref = new ReflectionFunction('array_unshift');

// WARNING: Call-time pass-by-reference has been deprecated
$ref->invoke(&$arr, 1);
$ref->invokeArgs(array(&$arr, 0));
var_dump($arr); // correct and expected result

// FATAL ERROR - Uncaught exception 'ReflectionException' with message
'Invocation of function array_unshift() failed'
$ref->invoke($arr, 1);
$ref->invokeArgs(array($arr, 0));
var_dump($arr); // nothing, because of fatal error ... 

exit;

Expected result:
----------------
I would like to do what I'm trying to do without errors.
I mean both fatal and warning.

Actual result:
--------------
An illogical problem for a simple operation.

You have a "passed by reference" in your core but you choosed to
disable send by reference in PHP ... and ReflectionFunction doesn't seem
to be able to manage this kind of "situation".

Please do not reply with something like: change your PHP configuration
... I would like to write not deprecated code. Thank You.


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=44139&edit=1

Reply via email to