<?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] 修改?? 是手册错了吗?

解决方案 »

  1.   

    http://docs.php.net/manual/zh/oop4.newref.php
    在这里,楼主下次学着贴代码,这么乱的贴出来谁都没耐心看下去
      

  2.   

    对象的变量赋值本来就是引用,你用==判断相当,===判断也相等,但如果用clone,你再==肯定还相等,===就不相等了。
    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啊。
      

  3.   


    那就是手册上说的是错的了?/* 输出为:
    set from outside
    set in constructor */这个结果我死活都得不出
      

  4.   

    屁哥,你找到PHP工作了吗???
      

  5.   

    咳咳, 先生, 注意你看的是附录里的php4的oop部分.....已经是过时的内容,保存在手册里只是为了特殊需要..你不需要看这部分内容如果不是在用php4,当然也不要在php5里测试....
      

  6.   

    楼主,给你举另外一个例子
    比如楼主叫“哈利波特”,楼主的父母教楼主“哈利”,楼主的同学叫楼主“波波”,实际上都是指的楼主“哈利波特”代码表现差不多就是这样
    $楼主="哈利波特"
    $哈利=&$楼主; //引用
    $波波=&$楼主; //引用
      

  7.   

    PHP 5  里面, 不是也有 & 符号引用对象吗? 如果加上 & ,就是引用,而不是给左边赋值一个拷贝了,我说的没错吧
      

  8.   

    php 5 里面,对象都是引用,不需要引用声明符 &
    如果需要产生副本,应使用 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 //没有改变,因为是副本
            ))
      

  9.   


    <?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 还存在!
      

  10.   

    看看别人的回复:♂幸福限量版♀<[email protected]>  17:59:13
    内存不一样。。一个是复制,一个是引用地址。。
      

  11.   

    $a = new T;//$a 已经是 new T 的示例的以用
    $b = $a; //虽然是变量赋值,但“值”是“引用”