PHP通过引用操作符分配不通过函数

时间:2014-07-16 21:44:11

标签: php reference variable-assignment assignment-operator

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

$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方法指向同一个对象?

3 个答案:

答案 0 :(得分:0)

事实上,你有2种方法可以做到这一点。请考虑以下示例:

<?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->users['u-'.$id]以使其正常工作。否则$user是一个简单的副本,您可以创建对$this->users['u-'.$id]副本的引用。但在其他情况下,当您不使用$user变量时,您应该简单地返回$this->users['u-'.$id]而不带参考号,这样就可以了。

您可以阅读有关Returning references

的更多信息

答案 1 :(得分:0)

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

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

解决了我的问题。看来我需要&函数和两个赋值。

答案 2 :(得分:0)

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

示例:

<?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-&gt;我对你在类中存储的实际数组元素的引用,所以:

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