簡體   English   中英

通過引用運算符進行的PHP賦值無法通過函數進行

[英]PHP Assignment by reference operator not working through functions

好的,所以我有一個可以通過以下方式訪問的對象:

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

實際上,您有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]而不使用引用符號,它將起作用。

您可以閱讀有關返回參考的更多信息

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

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

解決了我的問題。 看來我需要在函數和兩個賦值上加一個&

問題是您要分配由引用返回的值,而不是對要引用的實際元素的引用。

例:

<?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'];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM