引用运算符的PHP赋值不通过函数工作

Posted

技术标签:

【中文标题】引用运算符的PHP赋值不通过函数工作【英文标题】:PHP Assignment by reference operator not working through functions 【发布时间】:2014-09-07 14:29:10 【问题描述】:

好的,所以我有一个可以访问的对象:

$this -> users["u-###"]

其中### 替换为用户的ID 号。对于我的规范,我将经常访问一个特定的用户,因此我将 $this -> my 分配给了一个特定的用户 ID(例如 $this -> users["u-123"])。

在我开始编辑分配给这些变量之一的值之前,这一直满足我的需求。例如:

$this -> users["u-123"] = 12;

不会自动更新$this -> my(毕竟它是按值赋值)。现在,我想使用& 运算符来解决这个问题,但是我分配这个值的方式不是很传统。这是我的方法:

$this -> my = $this -> get_user(123);

地点:

function get_user($id)
    /* some stuff here.... */
    $user = $this -> users["u-" . $id];
    return $user;

所以我首先想到,只需更新分配,使其看起来像:

$this -> my = &$this -> get_user(123);

这并没有解决我的问题。所以我想在函数体内也这样做:

function get_user($id)
    /* some stuff here.... */
    $user = &$this -> users["u-" . $id];
    return $user;

但这也不能解决问题。有没有办法实现引用分配(所以$this -> my$this -> users["u-123"] 都用我的get_user 方法指向同一个对象?

【问题讨论】:

【参考方案1】:

事实上,您有两种方法。考虑以下示例:

<?php


class A 

    public $my;    
    public $users;
    public $my2;

    public function __construct() 
        $this -> users["u-5"] = 25;
        $this -> users["u-10"] = 16;

    

    function &get_user($id)
        /* some stuff here.... */
        $user = & $this -> users["u-" . $id];
        return $user;
     
    function & get_user2($id) 
        /* some stuff here.... */
        return $this->users['u-'.$id];
    

    function assign() 
        $this->my = & $this->get_user(5);

               

    function assign2() 
        $this->my2 = & $this->get_user(10);

          




$obj = new A();
$obj->assign();
echo $obj->my."<br />";
echo $obj->users['u-5']."<br />";
$obj->users['u-5'] = 10;
echo $obj->my."<br />";
echo $obj->users['u-5']."<br />";
echo "-------------<br />";
$obj->assign2();
echo $obj->my2."<br />";
echo $obj->users['u-10']."<br />";
$obj->users['u-10'] = 3;
echo $obj->my2."<br />";
echo $obj->users['u-10']."<br />";

在第一种情况下,当您使用新变量时,您还需要将其引用到$this-&gt;users['u-'.$id] 以使其工作。否则$user 是一个简单的副本,您创建对$this-&gt;users['u-'.$id] 副本的引用。但在其他情况下,当您不使用 $user 变量时,您应该简单地返回 $this-&gt;users['u-'.$id] 而不使用参考符号,它会起作用。

你可以阅读更多关于Returning references

【讨论】:

谢谢,我刚刚在你发帖之前解决了它,但我意识到我还需要在函数体内的赋值上使用&amp; 运算符。 @KeirSimmons 我已经编辑了我的答案。昨天我简单回复了快 请阅读以下内容:***.com/a/63914758/2943403 并考虑编辑您的答案。【参考方案2】:

问题是您通过引用分配值返回,而不是对您要引用的实际元素的引用。

例子:

<?php
class A 
    public function __construct() 
        $this->bar = array('u123' => 42);
        $this->foo = &$this->bar['u123'];
        $this->bar['u123'] = 1337;
        var_dump($this->foo);
    


new A();

这会输出1337,因为 foo 指向的值已更改。在您的代码中,您想让 $this->my 成为对您存储在类中的实际数组元素的引用,因此:

$this->my = &$this->user['u-123'];

【讨论】:

【参考方案3】:
function &get_user($id)
    /* some stuff here.... */
    $user = &$this -> users["u-" . $id];
    return $user;

$this -> my = &$this -> get_user($id);

解决了我的问题。看来我需要一个 &amp; 函数和两个任务。

【讨论】:

以上是关于引用运算符的PHP赋值不通过函数工作的主要内容,如果未能解决你的问题,请参考以下文章

c++ 拷贝构造函数与赋值运算符重载函数的区别是

c++中为啥赋值运算符重载返回类型是引用

c++中拷贝构造函数和赋值运算符重载本质上一样么

PHP的运算符

语法整理php

为啥我们在赋值运算符重载中使用引用返回而不是在加减运算中?