$a=new A;  //  $a 是 new A 的 指针 的一个拷贝 ( $a 保存的是 指针本身)
$a=& new A; // $a 是 new A 的 指针 的一个 引用 ( $a 保存的是 指针的地址)
以上说法正确吗?
另外:$c= & $a 的时候, 为什么会把 $a 也变成了 A 的指针的 引用 ?

解决方案 »

  1.   

    上面的一点笔误:$a=new A;  //  $a 是 new A 的 指针 的一个拷贝 ( $a 保存的是指针本身的拷贝)
      

  2.   

    $c= & $a 的时候, 为什么会把 $a 也变成了 A 的指针的 引用 ?是沿袭于  $a=& new A; ?
      

  3.   

    php里的变量都是指针,但对于string,int等,赋值=是对象的拷贝,对于对象,赋值=是地址的拷贝(也就是引用),我现在感觉这么理解挺好的。
      

  4.   


    可是,$c=new A;
    $d=&$c;  这只是对$d的操作啊,怎么 $c 也会变成了 对 new A 的引用的?
      

  5.   

    无论是 php 的什么版本 new 算符产生的都是引用
    $a =& new A;
    这种写法是不准确的。把一个对象的引用的引用赋给变量?
    所以在 php5.3 就新增了一个错误类型,来规范书写的格式
    Deprecated: Assigning the return value of new by reference is deprecated php5.2及以前不报错,但并不等于就不是错。
    就如同你屏蔽了 E_NOTICE 级别错误,但不能说就没有错,毕竟还是使用了 未经定义的变量或下标了嘛
      

  6.   


    看PHP手册:http://www.php.net/manual/zh/language.oop5.references.php $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>这里又说 $a,$b  都是同一个标识符的拷贝又说 $c ,$d是引用, 以上两种说法不是自相矛盾吗?难到因为是 $c 所以就是引用, 因为是$a 就是标识符的拷贝? 还跟变量的名字有关系?
      

  7.   

    正统的用法
    $c = new A;就当其它的用法都是扯淡了。
      

  8.   

    唉,还是看牛人的博客吧
    http://www.laruence.com/2008/09/19/520.html
    解释了你6楼的问题
      

  9.   

    查了一下手册:关于引用:
    在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。 关于new:
    Construct an instance of "type" and store the reference to the object into "result".
    所以$c = new A;是赋值引用而不是做对象拷贝。 $c = &new A; 是错误的写法。自 PHP 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息。 
      

  10.   

    关于赋值:注意赋值运算将原变量的值拷贝到新变量中(传值赋值),所以改变其中一个并不影响另一个。这也适合于在很密集的循环中拷贝一些值例如大数组。也可以使用引用赋值,用 $var = &$othervar; 语法。引用赋值意味着两个变量都指向同一个数据,没有任何数据的拷贝。有关引用的更多信息见引用的说明。在 PHP 5中,对象总是通过引用赋值的,除非明确使用新的 clone关键字。 <?php$a = 1;
    $b = &$a;
    $c = $a;$b = 2;
    echo "a:$a, b:$b, c:$c\n"; $d = $b;
    $d = 3;
    echo "a:$a, b:$b, c:$c\n"; class A {
        public $foo = 1;
    }$oa = new A;
    $ob = $oa;$oa->foo = 2;
    echo "oa:$oa->foo, ob:$ob->foo\n"; 
    ?>
    输出
    a:2, b:2, c:1
    a:2, b:2, c:1
    oa:2, ob:2
      

  11.   

    $a =1;
    $b = & $a; 
    不同的变量指向同一个地址,当其中一个($b=2)改变,那么另一个也会改变($a=2).但是把$b 销毁掉(unset($b))后 $a = 2还是存在的。$a =1;
    $b = $a;//他就是$b=1
    => $a =1;$b=1;
    $b $a 没有一毛钱的关系 ,你是你我是我,谁也管不着谁。$a=& new A; 这种东西我还真不用的,没啥意思。