web-dev-qa-db-ja.com

複数の変数の割り当ては、値または参照によって行われますか?

$a = $b = 0;

上記のコードでは、$a$bの両方に0の値が割り当てられていますか、それとも$aは単に$bを参照していますか?

39
Evil Elf

Rawタイプの場合、これはコピーです。

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

このコードを次のように見なしてください:

$a = ($b = 0);

$b = 0は、0$bに割り当てるだけでなく、結果も生成します。その結果は、割り当ての正しい部分、または単に$bが割り当てられた値です。

したがって、$aにも0が割り当てられます。

19

自分で試してみたかもしれません

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

または

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

(現在、私は本当に気にしません:D)

したがって:いいえ、どちらも値が0の独立変数です。

9
KingCrunch

私はこれをよく読むことをお勧めします: http://terriswallow.com/weblog/2007/multiple-and-dynamic-variable-assignment-in-php/ 。コメントの1つで、あなたは読むことができます:

1つの行で複数の割り当てを使用してオブジェクトを割り当てる場合、オブジェクトは参照によって割り当てられることに注意してください。したがって、いずれかの変数を使用してオブジェクトのプロパティの値を変更すると、値は本質的に両方で変化します。

したがって、個人的に変数を個別に割り当てることをお勧めします。

記録のために:

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

したがって、結論はプリミティブへの参照はないが、ISオブジェクトへの参照はあるということです。

3

$ aと$ bの両方にその値0が割り当てられます。$ aが$ bを参照するようにしたい場合は、アンパサンドでプリエンプトします。例:

$a = & $b = 0;

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

2
Taylor Gerring

何を割り当てるかによって異なります。

値を割り当てる場合、割り当ては元の変数を新しい変数にコピーします。

例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で参照によって割り当てられるオブジェクトで発生します。オブジェクトは、クローンキーワード。

例3

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

上記のコードは<html></html>を出力します。

2
kenorb

その両方に値0を割り当てます

1
mcgrailm