引用运算符的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->users['u-'.$id]
以使其工作。否则$user
是一个简单的副本,您创建对$this->users['u-'.$id]
副本的引用。但在其他情况下,当您不使用 $user
变量时,您应该简单地返回 $this->users['u-'.$id]
而不使用参考符号,它会起作用。
你可以阅读更多关于Returning references
【讨论】:
谢谢,我刚刚在你发帖之前解决了它,但我意识到我还需要在函数体内的赋值上使用&
运算符。
@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);
解决了我的问题。看来我需要一个 &
函数和两个任务。
【讨论】:
以上是关于引用运算符的PHP赋值不通过函数工作的主要内容,如果未能解决你的问题,请参考以下文章