多个变量赋值是通过值还是引用完成的?

时间:2011-06-06 19:42:10

标签: php variables variable-assignment

$a = $b = 0;

在上面的代码中,$a$b都分配了0的值,或$a仅引用$b

7 个答案:

答案 0 :(得分:44)

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

<强> test.php的

$a = $b = 0;

$b = 3; 

var_dump($a);
var_dump($b);

<强>输出

int(0) 
int(3)

使用对象,这是另一个故事(PHP 5)

<强> test.php的

class Obj
{ 
    public $_name;
}

$a = $b = new Obj();

$b->_name = 'steve';

var_dump($a);
var_dump($b);

<强>输出

object(Obj)#1 (1) { ["_name"]=> string(5) "steve" } 
object(Obj)#1 (1) { ["_name"]=> string(5) "steve" }

答案 1 :(得分:18)

将此代码视为:

$a = ($b = 0);

表达式$b = 0不仅会将0分配给$b,还会产生结果。该结果是作业的正确部分,或者只是$b分配给的值。

因此,$a也被分配了0

答案 2 :(得分:9)

你可以自己尝试一下

$a = $b = 0;
$a = 5;
echo $b;

$a = $b = 0;
$b = 5;
echo $a;

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

因此:不,它们都是具有值0的独立变量。

答案 3 :(得分:3)

我建议您好好阅读: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);

收率:

int(4)
int(4)
int(4)
int(5)

可是:

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);

收率:

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"
}

所以结论是没有对基元的引用,但是引用了对象。

答案 4 :(得分:2)

$ a和$ b都被赋值为0.如果你想要$ a来引用$ b,你可以用&符号来抢占它,例如:

$a = & $b = 0;

http://php.net/manual/en/language.oop5.basic.php

答案 5 :(得分:2)

这取决于你分配的内容。

如果您要分配值,则分配会将原始变量复制到新变量。

示例1:

$a = $b = 0;
$b++; echo $a;

上面的代码将返回0,因为它是按值分配的。

示例2:

$a = ($b = 4) + 5; // $a is equal to 9 now, and $b has been set to 4.

PHP中的值行为通常赋值的异常发生在对象上,这些对象在PHP 5中通过引用自动分配。可以通过clone关键字显式复制对象。

示例3

$a = $b = $c = new DOMdocument();
$c->appendChild($c->createElement('html'));
echo $a->saveHTML();

以上代码将打印<html></html>

答案 6 :(得分:1)

它为它们赋值0