对象和引用
在 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"