Bug #73238 [Asn->Csd]: call_user_func() doesn't pass-by-ref; variable functions do
Edit report at https://bugs.php.net/bug.php?id=73238&edit=1
ID: 73238
Updated by: git@php.net
Reported by: yohgaki@php.net
Summary: call_user_func() doesn't pass-by-ref; variable
functions do
-Status: Assigned
+Status: Closed
Type: Bug
Package: Unknown/Other Function
Operating System: Irrelevant
PHP Version: 7.0.11
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
Automatic comment on behalf of cmb69
Revision: https://github.com/php/doc-en/commit/2eb43ad4f41a8c62516abd804721786e50717af6
Log: Fix #73238: call_user_func() doesn't pass-by-ref; variable functions do
Previous Comments:
------------------------------------------------------------------------
[2021-09-22 11:43:04] cmb@php.net
> The issue remained is error on
>
> call_user_func('foo', $o);
Just don't use call_user_func; just call the callable directly
instead[1], what is possible for ages. It may be useful to
document that on the call_user_func() page.
The limitation regarding pass by reference is already documented.
[1] <https://3v4l.org/NHHQR>
------------------------------------------------------------------------
[2016-10-10 23:00:30] yohgaki@php.net
@nikic
I agree that errors should be raised for bogus calls like
call_user_func('foo', 'abc'); // Literal cannot be reference
call_user_func('foo', [$o]); // There is no modifiable value
call_user_func('foo', array_slice($a, 0, 1)); // There is no modifiable value
when foo() is
function foo(&$value) { ... }
These call_user_func() calls cannot be pass by reference. I'll update http://php.net/manual/en/function.call-user-func.php
and others to document behavior precisely.
The issue remained is error on
call_user_func('foo', $o);
$o could be actual value like $o="abc". (We also should consider functions return
reference which should be able to be updated)
Could this error be fixed/removed? If not, I'll just document call_user_func() parameter cannot
be a reference for any type of variables.
------------------------------------------------------------------------
[2016-10-10 22:15:14] nikic@php.net
These changes are intentional -- they bring the call_user_func VM implementation in line with the
actual function. call_user_func() categorically cannot pass references, so you get a warning. (At
least this is part of it.)
However, in PHP 7.1 we have changed call_user_func() to still proceed with the call even if such a
warning occurs. Previously the call would be aborted (which would be a BC break). Now it will
continue as normal, only with the warning.
------------------------------------------------------------------------
[2016-10-10 22:10:50] yohgaki@php.net
More test code
https://3v4l.org/TZaVe (array)
https://3v4l.org/WMMQa (string)
https://3v4l.org/OEOA1 (return value check)
Removing error from call_user_func('foo', $value), when $value is object, is preferred.
foo() could be.
function foo(&$value) {
if (is_string($value)) {
$value = 'update $value';
} else if (is_object($value)) {
$value->some_var = 'add some_var';
} else {
trigger_error('You should pass string or object');
}
}
------------------------------------------------------------------------
[2016-10-04 01:10:04] yohgaki@php.net
Description:
------------
As you can see, newer PHPs have additional errors with call_user_func().
https://3v4l.org/oBnkT
Warning: Parameter 1 to foo() expected to be a reference, value given in /in/oBnkT on line 10
Warning: Parameter 1 to foo() expected to be a reference, value given in /in/oBnkT on line 11
I found this errors from Wordpress installation.
https://wordpress.org/support/topic/wp-4-6-1-got-error-with-php-7-1/
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=73238&edit=1
Thread (6 messages)