推送到类方法返回的引用的关联多维数组中

Push into referenced associative, multidimensional array returned by class method

提问人:Kay Angevare 提问时间:9/14/2022 最后编辑:halferKay Angevare 更新时间:9/19/2022 访问量:46

问:

作为我为简化 CodeIgniter3 应用程序的遗留代码库所做的持续努力的一部分,我目前遇到了一个问题。简而言之,我之前已经处理过一个错误语句,其中指出:

can't use method return value in write context

这可能会给一些读者敲响警钟。尽管如此,从那以后我就没有看到这个错误,但我怀疑仍然有问题。简而言之,我正在尝试将一个关联数组推入另一个关联的多维数组,该数组是返回引用的方法的结果。

我已经设置了一个系统来轻松更改 JSON 的内容,该内容通过以下方法通过引用返回:

/**
 * Function :   items
 * Target   :   Retrieves a reference to the items, decoded
 * 
 * @author  :   Angev
 * @since   :   2.0
 * @version :   1.0
 * 
 * @return      Referenced link to index 'items'.
 */
public function & items()
{
    $list = (is_array($this->data)) ? $this->data : json_decode($this->data, true);
    return $list['items'];

}

简而言之,该方法是名为“CheckList”的模型的一部分。该清单与我的数据库中的数据表相对应,该表包括一个“data”列,该列表示属于某个清单的数据:我尝试更改的 JSON,您可以看到在此方法中返回的 JSON。查看输出的另一种方法是,它应该返回对 的引用。$this->items()$this->items()$this->data['items']

这很顺利,我在开发过程中多次使用这种方法 - 作为访问的简写 - 它总是准确地返回我需要它返回的内容:一个多维数组,其中填充了唯一的索引(字符串),其中包含属于清单中每个项目的数据。['list']

但是,问题出现在特别命名的方法中:update_checklist()

  $this->items()[$uid] = [
                           'parent_id' => $parent['id'],
                           ... ,
                         ];

我希望该方法将索引添加到 $this->items() 返回的数组中,但事实并非如此。 我不太确定在这种情况下出了什么问题,因为我之前已经看到过写在这个问题顶部的错误消息,但从那以后就再也没有看到过。

但是,没有索引添加到数组中,并且每当我之后立即执行var_dump($this->items())时。它只是显示数组在执行 之前的状态。update_checklist()

为了寻找答案,我还尝试将回调括在括号中,但无济于事:

  ( $this->items() )[$uid] = . . .

为了暂时解决这个问题,我通过执行以下操作对 ['items'] 数组进行了更直接的更改:

$this->data = json_decode($this->data, true);      
$this->data['items'][$uid] = [
                               'parent_id' => $parent['id'],
                               ... ,
                             ];

尽管如此,即使上面的代码有效,我仍然想知道我的方法引用返回的逻辑中有什么缺陷,以及为什么我在推入引用的数组时不能使用此方法。$this->items()

我怎样才能编写所需的更改以使功能按预期运行?或者我会对更清晰地了解这种结构背后的理论以及为什么它不起作用感兴趣。$this->items()[]

PHP 数组 codeigniter 传递引用 php-8

评论


答:

1赞 Kay Angevare 9/14/2022 #1

与往常一样,一旦你开始提出一个问题,你就会偶然发现你的逻辑缺陷。我和一位同事一起阅读了这个问题,在讨论解决方案时,解决方案神奇地出现了。我将提供答案,供将来有相同问题的任何人参考。

/**
 * Function :   items
 * Target   :   Retrieves a reference to the items, decoded
 * 
 * @author  :   Angev
 * @since   :   2.0
 * @version :   1.0
 * 
 * @return      Referenced link to index 'items'.
 */
public function & items()
{
    $list = (is_array($this->data)) ? $this->data : json_decode($this->data, true);
    return $list['items'];

}

问题出在方法上。此方法肯定会返回一个引用,但引用的是 初步变量 ,而该变量又没有直接引用 。因此,该方法返回的不是引用 ,而是返回对 的引用,它本质上是 的副本,no no no real reference。items()$list$this->data$this->data['items']$list$this->data

为了解决此问题,使用了以下代码:

public function & items()
{
    if(!is_array($this->data) ) $this->data = json_decode($this->data, true);
    return $this->data['items'];

}

正如预期的那样,该方法现在返回对实际数据对象的引用。

简而言之,我学到的是,如果你让一个方法返回一个引用,你需要确保该方法返回的任何内容实际上都是一个引用,而不是你试图引用的数据的副本。

我现在将这个问题搁置一旁,以便让其他人分享有关此事的任何见解知识。