PHP 引用没有像我期望的那样工作

标签 php oop reference

基本上我对引用工作的理解是

$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,但事实并非如此在这种情况下,TomSam 都出现在对象中。为什么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/

相关文章:

c++ - 从函数内更改对象状态

c++ - 这样安全吗?右值和引用返回值

python - Python 中的引用

java - 将对象本身 (this) 传递给字段的方法是一种糟糕的方法吗?

php - Laravel: 错误 [PDOException]: 找不到驱动程序 (PostgreSQL)

php - 识别一个字符,然后在php中高亮显示

php - Swift:NSURL 正确地从 Playground 中的 URL 返回 HTML,但在应用程序中使用时会使模拟器崩溃

java.util.concurrent.TimeUnit 类设计模式

java - Scala 选择在签名冲突的情况下实现哪个特征?

php - 当我在 PHP 中使用对另一个类的引用时,插入 MySQL 不起作用