对象标识符的副本和对象标识符的引用 - 应该在真实应用程序中使用哪一个?

P K*_*P K 9 php oop

在下面的示例中,由原始对象完成$instance2$instance3修改任何操作.

我的问题是:

如果原始对象标识符的副本和对原始对象标识符的引用执行相同的工作,应该在实际应用程序中使用哪一个?

使用对象标识符副本和使用对象标识符的引用有什么优缺点?

我阅读了PHP手册但无法区分使用方法因为两者都做同样的工作.

$instance1 = new test(1);
$instance2 = $instance1;
$instance3 =& $instance1;

//$instance1 -> original object identifier of the new object.
//$instance2 -> copy of object identifier $instance1
//$instance3 -> reference to the object identifier $instance1
Run Code Online (Sandbox Code Playgroud)

Lum*_*dil 6

$instance2有一个标识符的副本到对象测试.所以,它包含相同的$instance1. $instance3包含对的引用$instance1.不同之处如下:

$instance1 = new Test();
$instance2 = $instance1;
$instance3 = & $instance1;

var_dump($instance1 instanceof Test); // True
var_dump($instance2 instanceof Test); // True
var_dump($instance3 instanceof Test); // True

$instance3 = new AnotherTest();

var_dump($instance1 instanceof AnotherTest); // True
var_dump($instance2 instanceof AnotherTest); // False
var_dump($instance3 instanceof AnotherTest); // True
Run Code Online (Sandbox Code Playgroud)

如果$instance1更改而不是,则返回相同的输出$instance3.

但如果我们做了以下事情:

$instance1 = new Test();
$instance2 = $instance1;
$instance3 = & $instance1;

$instance2 = new AnotherTest();

var_dump($instance1 instanceof AnotherTest); // False
var_dump($instance2 instanceof AnotherTest); // True
var_dump($instance3 instanceof AnotherTest); // False
Run Code Online (Sandbox Code Playgroud)

所以:

修改已通过引用传递或通过引用(使用&操作数)或其引用的变量分配的变量,修改两者,而修改复制变量仅修改给定变量.

但是,您必须记住$instance1保留的是对象的标识符,因此:

$instance1 = new StdClass();
$instance2 = $instance1;

$instance1->my_property = 1;
var_dump($instance2->my_property); // Output: 1
Run Code Online (Sandbox Code Playgroud)

希望现在更清楚了.