【问题标题】:PHP Assignment by reference operator not working through functions引用运算符的PHP赋值不通过函数工作
【发布时间】: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 方法指向同一个对象?

【问题讨论】:

    标签: php reference variable-assignment assignment-operator


    【解决方案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 我已经编辑了我的答案。昨天我简单回复了快
    • 请阅读以下内容:stackoverflow.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; 函数和两个任务。

      【讨论】:

        猜你喜欢
        • 2010-12-18
        • 1970-01-01
        • 2012-08-24
        • 2011-12-12
        • 2015-04-06
        • 1970-01-01
        • 2016-08-20
        相关资源
        最近更新 更多