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

PHP Assignment by reference operator not working through functions

提问人:Keir Simmons 提问时间:7/17/2014 更新时间:7/17/2014 访问量:170

问:

好的,所以我有一个对象,可以按如下方式访问:

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

其中 ### 替换为用户的 ID 号。对于我的规范,我将经常访问一个特定用户,因此我已分配给特定用户 ID(例如)。$this -> my$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 引用 variable-assignment assignment-operator

评论


答:

0赞 Marcin Nabiałek 7/17/2014 #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 />";

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

您可以阅读有关返回引用的更多信息

评论

0赞 Keir Simmons 7/17/2014
谢谢,我在你发布之前就解决了它,但意识到我还需要函数体中分配的运算符。&
0赞 Marcin Nabiałek 7/17/2014
@KeirSimmons 我已经编辑了我的答案。昨天我已经简单地回复了快速
0赞 mickmackusa 9/16/2020
请阅读以下内容:stackoverflow.com/a/63914758/2943403 并考虑编辑您的答案。
0赞 Keir Simmons 7/17/2014 #2
function &get_user($id){
    /* some stuff here.... */
    $user = &$this -> users["u-" . $id];
    return $user;
}

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

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

0赞 MatsLindh 7/17/2014 #3

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

例:

<?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();

这将输出 ,因为 foo 指向的值发生了变化。在代码中,您希望使 $this->my 引用您存储在类中的实际数组元素,因此:1337

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