<?php
class Foo {
function Foo($name) {
// 在全局数组 $globalref 中建立一个引用
global $globalref;
$globalref[] = &$this;
// 将名字设定为传递的值
$this->setName($name);
// 并输出之
$this->echoName();
}
function echoName() {
echo "<br />",$this->name;
} function setName($name) {
$this->name = $name;
}
}
$f=new Foo("fuck");$globalref[0]->echoName();$f->setName("siht");
$globalref[0]->echoName();?>以上这段代码,手册上说,如果修改为如下:<?php
// 现在改个名字,你预期什么结果?
// 你可能预期 $bar1 和 $globalref[0] 二者的名字都改了...
$bar1->setName('set from outside');// 但如同前面说的,并不是这样。
$bar1->echoName();
$globalref[0]->echoName();/* 输出为:
set from outside
set in constructor */注意到这里两个输出:set from outside
set in constructor */如果说 $bar1 和 $globalref[0] 为同一个对象,因为 $globalref[0] = &$this;前面 的 & 号,是不是使得 $globalref[0] 和 $bar1 指向同一个对象?如果不是,那为什么无法得到以上输出的结果?即修改了 $bar1 会同时把 $globalref[0] 修改?? 是手册错了吗?
class Foo {
function Foo($name) {
// 在全局数组 $globalref 中建立一个引用
global $globalref;
$globalref[] = &$this;
// 将名字设定为传递的值
$this->setName($name);
// 并输出之
$this->echoName();
}
function echoName() {
echo "<br />",$this->name;
} function setName($name) {
$this->name = $name;
}
}
$f=new Foo("fuck");$globalref[0]->echoName();$f->setName("siht");
$globalref[0]->echoName();?>以上这段代码,手册上说,如果修改为如下:<?php
// 现在改个名字,你预期什么结果?
// 你可能预期 $bar1 和 $globalref[0] 二者的名字都改了...
$bar1->setName('set from outside');// 但如同前面说的,并不是这样。
$bar1->echoName();
$globalref[0]->echoName();/* 输出为:
set from outside
set in constructor */注意到这里两个输出:set from outside
set in constructor */如果说 $bar1 和 $globalref[0] 为同一个对象,因为 $globalref[0] = &$this;前面 的 & 号,是不是使得 $globalref[0] 和 $bar1 指向同一个对象?如果不是,那为什么无法得到以上输出的结果?即修改了 $bar1 会同时把 $globalref[0] 修改?? 是手册错了吗?
在这里,楼主下次学着贴代码,这么乱的贴出来谁都没耐心看下去
11[User:root Time:23:09:38 Path:/home/liangdong/php]$ cat test.php
<?php
class t {
public $var;
}$t = new t();
$a = &$t;
$b = $t;
echo $a === $t;
echo $a === $b;
?>肯定是输出11啊。
那就是手册上说的是错的了?/* 输出为:
set from outside
set in constructor */这个结果我死活都得不出
比如楼主叫“哈利波特”,楼主的父母教楼主“哈利”,楼主的同学叫楼主“波波”,实际上都是指的楼主“哈利波特”代码表现差不多就是这样
$楼主="哈利波特"
$哈利=&$楼主; //引用
$波波=&$楼主; //引用
如果需要产生副本,应使用 clone 函数
class T {
var $v = 1;
}$a = new T;
$b = $a;
$c = clone($a);
$b->v = 2;
print_r(array($a, $b, $c));
Array
(
[0] => T Object
(
[v] => 2 //改变了,因为是引用
) [1] => T Object
(
[v] => 2
) [2] => T Object
(
[v] => 1 //没有改变,因为是副本
))
<?phpclass T {
var $v = 1;
}$a = new T;
$b = $a;
$c = clone($a);
$b->v = 2;$a=null; //你在这里加个null 看看print_r(array($a, $b, $c));?>输出:Array ( [0] =>
[1] => T Object ( [v] => 2 )
[2] => T Object ( [v] => 1 )
) 很明显 $b 并没有引用 $a 吗!!$a=null 后 $b 还存在!
内存不一样。。一个是复制,一个是引用地址。。
$b = $a; //虽然是变量赋值,但“值”是“引用”