php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #80066 List Reference Assignment: Cannot reference an array value by return
Submitted: 2020-09-06 19:40 UTC Modified: 2020-09-06 20:53 UTC
From: php-0919 at jan-runte dot de Assigned:
Status: Verified Package: Variables related
PHP Version: 7.3.22 OS: macOS 10.15.6
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: php-0919 at jan-runte dot de
New email:
PHP Version: OS:

 

 [2020-09-06 19:40 UTC] php-0919 at jan-runte dot de
Description:
------------
Feature 7.3 - List Reference Assignment:
- https://wiki.php.net/rfc/list_reference_assignment

When attempting to transfer an array return value via the list reference assignment to certain keys with by-reference, the error "Attempting to set reference to non referenceable value" occurs.

But the belonging value of that key is a referenceable value - it is an array.

7.3.13: failed
7.3.22: failed
7.4.3: failed
7.4.10: failed
8.0.0beta2: failed
8.0.0beta3: failed

Test script:
---------------
function returnsArrayWithReferencedValue(array &$subject) : array {
    return [
        'a' => &$subject,
	'b' => 123,
    ];
}


$source = [
    'c' => [],
];

/*****************
/* PREFERRED WAY *
 *****************/

['a' => &$referencedArray] = returnsArrayWithReferencedValue($source);

// Throws an error: "Attempting to set reference to non referenceable value in ..."


/**************
/* WORKAROUND *
 **************/

// First set returned array to a variable
$returnedArray = returnsArrayWithReferencedValue($source);

$source['d'] = 456; // manipulate source array
var_dump($returnedArray['a']);


/**********
/* MOCKUP *
 **********/

// Fake returned array as a prepared variable
$fakeReturnedArray = [
    'a' => &$source,
    'b' => 123,	
];

['a' => &$referencedArray] = $fakeReturnedArray;
$source['d'] = 456; // manipulate source array
var_dump($referencedArray);

Expected result:
----------------
array(2) {
  ["c"]=>
  array(0) {
  }
  ["d"]=>
  int(456)
}

Actual result:
--------------
Throws an error: Attempting to set reference to non referenceable value

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2020-09-06 20:53 UTC] requinix@php.net
-Status: Open +Status: Verified
 [2020-09-06 20:53 UTC] requinix@php.net
PHP is complaining because the function doesn't return by-reference. If it does then there's no error and everything works.

I don't think that requirement is necessary: the whole return value is not what is being referenced, only the items inside, and array items can certainly be references without their parent arrays being references too.
 
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Fri Oct 30 04:01:20 2020 UTC