php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #75148 Changing array entry including &$this causes warning with call_user_func_array
Submitted: 2017-09-01 21:54 UTC Modified: 2020-12-07 12:00 UTC
From: robin at ambitionally dot com Assigned:
Status: Open Package: Scripting Engine problem
PHP Version: 7.1.9 OS: Windows, Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: robin at ambitionally dot com
New email:
PHP Version: OS:

 

 [2017-09-01 21:54 UTC] robin at ambitionally dot com
Description:
------------
When modifying an argument array that includes an entry for &$this, the assignment operation seems to de-reference the &$this argument. As shown in the test script, line 6 and line 8 are identical, and line 7 assigns the same value to index [0] of the array.

The issue is specific to PHP 7.1 (I have tested with 7.1.8 and 7.1.9), but it does not appear in PHP 7.0.

var_dump before and after the assignment operation has the same printout. There is a difference in var_dump output between PHP 7.0 and 7.1. In 7.1, the var_dump output is missing the "&" for array entry [1], while the "&" symbol is present in PHP 7.0.

This issue causes problems for WordPress sites, as it uses similar logic when running filters (WP_Hook::apply_filters).

Test script:
---------------
<?php
function test_call($first, &$a) {
  echo '<div>here</div>';
}
function test_warning($args) {
  call_user_func_array( 'test_call', $args ); // this line works
  $args[ 0 ] = 1;
  call_user_func_array( 'test_call', $args ); // this line causes error
}
class TestWarningClass{
  function __construct() {
      $args = array( 1, &$this );
      test_warning($args);
  }
}
$test = new TestWarningClass;

Expected result:
----------------
No warning. Two lines of "here" are printed.

Actual result:
--------------
Warning: Parameter 2 to test_call() expected to be a reference, value given

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2017-09-04 22:24 UTC] cmb@php.net
-Package: Class/Object related +Package: Scripting Engine problem
 [2020-12-07 12:00 UTC] cmb@php.net
I think this is related to the changes to call_user_func()
handling of reference arguments[1], and likely something that
won't be fixed.  Use variable functions and the splat operator
instead[2].

[1] <https://www.php.net/manual/en/migration71.incompatible.php#migration71.incompatible.call_user_func-with-ref-args>
[2] <https://3v4l.org/MDLLi>
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Mar 28 14:01:29 2024 UTC