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
Votes:1
Avg. Score:2.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
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
Anyone can comment on a bug. Have a simpler test case? Does it work for you on a different platform? Let us know!
Just going to say 'Me too!'? Don't clutter the database with that please — but make sure to vote on the bug!
Your email address:
MUST BE VALID
Solve the problem:
44 - 4 = ?
Subscribe to this entry?

 
 [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.
 [2022-12-27 08:06 UTC] janettabloomquist at gmail dot com
The solution is an array! An array can hold many values under a single name, and you can access the values by referring to an index number. Creating an Array. Arrays cannot be passed by value, therefore they cannot be returned. 
(https://www.mysutteronline.us/)github.com
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Apr 19 23:01:28 2024 UTC