首页 > 试题广场 >

阅读下面PHP代码,并选择输出结果( )

[单选题]
 阅读下面PHP代码,并选择输出结果(  )
<?php 
class A{
    public $num=100; 
}
$a = new A();
$b = $a;
$a->num=200;
echo $b->num;
?>
  • 100
  • 200
  • 没有输出
  • 程序报错!
在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。
发表于 2015-08-11 18:42:36 回复(3)
cuz头像 cuz
对象的复制是通过引用来实现的,$a=new A();$b=$a;相当于$a=new A();$b=&$a;
发表于 2016-03-13 22:05:51 回复(4)

对象和引用

在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

编辑于 2020-06-04 22:11:54 回复(0)
“对象的存储”与“普通变量的存储”是有所区别的
“普通变量”的变量名存储数据是引用关系;
$var1=1;
$var1—>引用关系—>1

对象变量 ”的变量名对象数据之间也是引用关系,但是他们之间存在一个“对象标识符
$a—> 引用关系—> 对象标识符#1—>引用关系—>100
而 操作 $b=$a;就是将$a的对象标识符#1  复制给$b
$b—> 引用关系—> 对象标识符#1 —> 引用关系—>100
所以,$a->num=200;这个操作改变了对象数据的值,因此$b通过对象标识符#1 获取的数据值就是200
发表于 2016-09-27 22:04:57 回复(0)
$b = $a;
$c = &$a;
以上指向同一片内存空间。
下面的操作开辟新的内存空间。
$d = clone $a;
发表于 2018-03-06 14:32:59 回复(0)
可以看看这篇博客,写得很清楚
发表于 2017-08-29 19:32:43 回复(0)
B 对象引用相同位置
发表于 2015-04-10 20:46:20 回复(1)
B, $b $a指向同一个内存标识。
发表于 2015-02-25 19:16:42 回复(1)
在PHP中,基本类型变量放在栈中,对象、数组放在堆中,对象中真正的内容是存在堆中,$a只是存放了该对象在堆中的地址,将$a 赋给$b,只是把对应的地址给了他,即$a、$b都存放了对象在堆中的地址,所以$b->num和$a->num访问的是同一份数据。
发表于 2018-05-24 20:57:00 回复(6)
我觉得他们说的都不全面,有些没有解释清楚。以下回答如果有问题,请指出。
1、当$a = $b时,这个时候他们共用同一个内存地址,但是,当$a 或 $b 其中一个发生改变时,就会重新分配一块内存。他们也就互不影响了。这叫写时复制(COW)
2、当$a = &$b时,分配的是$b 的内存地址给$a,所以当一个发生改变时,另一个也随着改变。
3、当使用clone作用对象时,会重新分配内存。他们互不影响。
4、但是当作用于对象的时候,= 和 &一样,都是共用同一个内存地址。而clone时是重新分配内存空间
编辑于 2019-07-02 10:43:14 回复(1)


<?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
编辑于 2022-01-20 15:25:11 回复(1)
这个跟引用不是一回事吧,要是讲new a()换乘其他的应该就不是200了吧,猜测
发表于 2022-01-07 19:59:36 回复(0)
引用一楼的解释:在PHP中,基本类型变量放在栈中,对象、数组放在堆中,对象中真正的内容是存在堆中,$a只是存放了该对象在堆中的地址,将$a 赋给$b,只是把对应的地址给了他,即$a、$b都存放了对象在堆中的地址,所以$b->num和$a->num访问的是同一份数据
发表于 2020-04-04 23:03:52 回复(0)
浅拷贝深拷贝
发表于 2019-01-31 23:13:31 回复(0)
对象的赋值等同于引用
发表于 2018-03-16 10:37:40 回复(0)
引用没有开辟空间
发表于 2018-03-09 21:18:27 回复(0)
对象的复制相当于引用!!!!!取消发表
发表于 2017-10-25 21:26:26 回复(0)
new的对象是向内存申请了一块指定空间,a,b之间赋值并没有改变或新增空间,故对num重新赋值,再取出来依然是赋值好的num,
发表于 2016-12-20 15:52:24 回复(0)
a对象赋给b,b调用num成员
发表于 2016-11-08 21:02:09 回复(0)
B 引用
发表于 2016-09-17 15:29:45 回复(0)