多个变量赋值是按值还是按引用完成?

问题描述 投票:0回答:8
$a = $b = 0;

在上面的代码中,

$a
$b
都被赋予了
0
的值,还是
$a
只是引用了
$b

php variables variable-assignment
8个回答
57
投票

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

测试.php

$a = $b = 0;

$b = 3; 

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

输出

int(0) 
int(3)

对于对象,那就是另一个故事了(PHP 5)

测试.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" }

20
投票

将此代码视为:

$a = ($b = 0);

表达式

$b = 0
不仅将
0
赋值给
$b
,而且还产生一个结果。该结果是分配的正确部分,或者只是
$b
分配给的值。

因此,

$a
也被分配为
0


9
投票

你可以自己尝试一下

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

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

(目前我不太关心:D)

因此:不,它们都是自变量,其值为

0


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

产量:

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
投票

这取决于您分配的内容。

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

示例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>


2
投票

$a 和 $b 都被赋予 0 值。如果您希望 $a 引用 $b,您可以用 & 符号抢占它,例如:

$a = & $b = 0;

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


1
投票

它为它们分配了值 0


0
投票

价值观

$a = $b = 0;

相同
$a = 0;
$b = 0;

物体

$obj = new TestObject();
$a = $b = $obj;

相同
$obj = new TestObject();
$a = $obj;
$b = $obj;

将变量设置为等于 PHP 中的现有对象将通过 REFERENCE 传递。除非您添加

clone
关键字,否则它不会进行深层复制。

长链条

这种模式也适用于较长的链条。

$a = $b = $c = 0;

相同
$a = 0;
$b = 0;
$c = 0;

您可以确认使用 PHP 沙箱:https://onlinephp.io/c/7b70f

© www.soinside.com 2019 - 2024. All rights reserved.