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
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
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

Pull Requests

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
 [2024-05-09 05:20 UTC] patrick521fritz at gmail dot com
This php bug results is very great for me this is very nice. (https://github.com)(https://www.aarp-mahjongg.com)
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 14:01:32 2024 UTC