对象和引用

在 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

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

/**
 * 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"

results matching ""

    No results matching ""