基本上我对引用工作的理解是
$a = 5;
$b = &$a;
$a = 10;
echo $b; // 10;
然而,在这段代码中,我得到了意想不到的结果(对我来说,这可能有一个解释)
class Room {
private $users = array();
public function addUser(&$user){
$this->users[] = $user;
}
}
$users = array(
1 => 'Tom',
2 => 'Hank',
3 => 'Sam',
4 => 'John'
);
$room = new Room();
$room->addUser($users[1]);
$room->addUser($users[3]);
unset($users[3]);
echo "<pre>" . print_r($room, true) . "</pre>";
echo "<pre>" . print_r($users, true) . "</pre>";
我预计,在取消设置 $users[3]
后,$room
内的唯一用户是 Tom
,但事实并非如此在这种情况下,Tom
和 Sam
都出现在对象中。为什么unset
不影响对象的属性?
编辑:
即使我通过示例更进一步并创建一个类User
,效果仍然相同
class Room {
private $users = array();
public function addUser(&$user){
$this->users[] = $user;
}
}
class User {
public $name;
function __construct($name){
$this->name = $name;
}
}
$users = array(
1 => new User('Tom'),
2 => new User('Hank'),
3 => new User('Sam'),
4 => new User('John')
);
$room = new Room();
$room->addUser($users[1]);
$room->addUser($users[3]);
unset($users[3]);
echo "<pre>" . print_r($room, true) . "</pre>";
echo "<pre>" . print_r($users, true) . "</pre>";
最佳答案
Unset 对符号进行操作,而不是对引用目标进行操作。
这就是为什么对 undefined variable 使用 unset 不会引发任何类型的错误。
$a = 10;
$b = &$a;
unset($b); // forget the name "$b" exists.
echo $a; // 10
如果您想在两个地方都取消设置,则必须将 null
分配给其中一个变量。这是“硬取消设置”,而不是您当前正在执行的“软取消设置”。
此外,您分配的不是引用,而是分配的副本。
$this->users[] = &$user;
关于PHP 引用没有像我期望的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26385017/