# 对象和引用

在 PHP 的对象编程中经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。PHP 的引用是别名，就是两个不同的变量名字指向相同的内容。在 PHP 中，一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。当对象作为参数传递，作为结果返回，或者赋值给另外一个变量，另外一个变量跟原来的不是引用的关系，只是他们都保存着同一个标识符的拷贝，这个标识符指向同一个对象的真正内容。

```php
<?php

class Foo
{
    /**
     * Just a test property.
     *
     * @var string
     */
    public string $property = 'foo';
}

$foo = new Foo();
$bar = $foo;
$foo->property = 'bar';
var_dump($bar->property); // string(3) "bar"

```

标识符的拷贝和引用：

```php
<?php

class Foo
{
    /**
     * Just a test property.
     *
     * @var string
     */
    public string $property = 'foo';
}

$foo = new Foo();
$bar = $foo;
$baz = &$foo;
$foo = null;
var_dump($foo); // NULL
var_dump($bar); // object(Foo)#1 (1) { ["property"]=> string(3) "foo" }
var_dump($baz); // NULL

```

当对象作为参数传递：

```php
<?php

/**
 * Change the specified property of the specified class.
 *
 * @param  Foo    $instance
 * @return void
 */
function foo(Foo $instance)
{
    $instance->property = 'bar';
}

class Foo
{
    /**
     * Just a test property.
     *
     * @var string
     */
    public string $property = 'foo';
}

$foo = new Foo();
foo($foo);
var_dump($foo->property); // string(3) "bar"

```

