<?php
class A{
public $num=100;
}
$a = new A();
$b = $a;
$a->num=200;
echo $b->num;
?>
在php5 的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。
PHP 的引用是别名,就是两个不同的变量名字指向相同的内容。在 PHP 5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。
Example #1 引用和对象
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a; // $a ,$b都是同一个标识符的拷贝
// ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";
$c = new A;
$d = &$c; // $c ,$d是引用
// ($c,$d) = <id>
$d->foo = 2;
echo $c->foo."\n";
$e = new A;
function foo($obj) {
// ($obj) = ($e) = <id>
$obj->foo = 2;
}
foo($e);
echo $e->foo."\n";
?> 以上例程会输出:
2 2 2
参考:
https://www.php.net/manual/zh/language.oop5.references.php
<?php
class A
{
public $num = 100;
}
$a = new A();
echo '****************************';
$a->num = 200;
dump($a);
dump($a->num);
echo '****************************';
$b = $a;
$a->num = 100;
dump($b);
dump($b->num);
echo '****************************';
$c = $b;
$a->num = 50;
dump($c);
dump($c->num);
function dump($d)
{
print_r($d);
echo "\n";
}
输出:
输出====>>>>>>
/var/www/html # php test.php
****************************A Object
(
[num] => 200
)
200
****************************A Object
(
[num] => 100
)
100
****************************A Object
(
[num] => 50
)
50