Bob*_*neu 48

对于原始类型,这是一个副本.

test.php的

$a = $b = 0;

$b = 3; 

var_dump($a);
var_dump($b);
Run Code Online (Sandbox Code Playgroud)

输出:

int(0) 
int(3)
Run Code Online (Sandbox Code Playgroud)

但是对于对象,这是另一个故事(PHP 5)

test.php的

class Obj
{ 
    public $_name;
}

$a = $b = new Obj();

$b->_name = 'steve';

var_dump($a);
var_dump($b);
Run Code Online (Sandbox Code Playgroud)

产量

object(Obj)#1 (1) { ["_name"]=> string(5) "steve" } 
object(Obj)#1 (1) { ["_name"]=> string(5) "steve" }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,该示例具有误导性:更改对象的属性与更改引用对象的变量不同.因为变量从未改变过,所以它当然是相同的. (7认同)
  • 通过引用分配对象可以更改为使用`clone`复制分配.EG:`$ a = clone $ b = new Obj;` (4认同)

Bla*_*iev 18

将此代码视为:

$a = ($b = 0);
Run Code Online (Sandbox Code Playgroud)

表达$b = 0不仅分配0$b,但它产生的结果为好.该结果是赋值的正确部分,或者仅仅是赋值的值$b.

所以,也$a被分配0了.


Kin*_*nch 9

你可以自己尝试一下

$a = $b = 0;
$a = 5;
echo $b;
Run Code Online (Sandbox Code Playgroud)

要么

$a = $b = 0;
$b = 5;
echo $a;
Run Code Online (Sandbox Code Playgroud)

(目前我真的不在乎:D)

因此:不,它们都是具有该值的自变量0.


Tom*_*zyk 5

我会推荐一个很好的阅读:http : //terriswallow.com/weblog/2007/multiple-and-dynamic-variable-assignment-in-php/。在评论之一中,您可以阅读:

需要注意的是,如果在一行中使用多重赋值来赋值一个对象,则该对象是通过引用赋值的。因此,如果您使用任一变量更改对象属性的值,则两者的值本质上都会发生变化。

所以我个人建议你单独分配变量。

作为记录:

$a = $b = 4;
var_dump($a, $b);
$b = 5;
var_dump($a, $b);
Run Code Online (Sandbox Code Playgroud)

产量:

int(4)
int(4)
int(4)
int(5)
Run Code Online (Sandbox Code Playgroud)

但:

class Tmp
    {
    public $foo;

    public function __construct()
        {
        $this->foo = 'bar';
        }
    }

$a = $b = new Tmp();
var_dump($a, $b);
$a->foo = 'oth';
var_dump($a, $b);
Run Code Online (Sandbox Code Playgroud)

产量:

object(Tmp)#1 (1) {
  ["foo"]=>
  string(3) "bar"
}
object(Tmp)#1 (1) {
  ["foo"]=>
  string(3) "bar"
}
object(Tmp)#1 (1) {
  ["foo"]=>
  string(3) "oth"
}
object(Tmp)#1 (1) {
  ["foo"]=>
  string(3) "oth"
}
Run Code Online (Sandbox Code Playgroud)

所以结论是没有对原语的引用,但有对对象的引用。