Многократные назначения переменных сделаны значением или ссылкой? - PullRequest
32 голосов
/ 06 июня 2011
$a = $b = 0;

В приведенном выше коде для $a и $b назначено значение 0, или $a просто ссылается на $b?

Ответы [ 7 ]

45 голосов
/ 06 июня 2011

С необработанными типами это копия.

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" }
18 голосов
/ 06 июня 2011

Рассматривайте этот код как:

$a = ($b = 0);

Выражение $b = 0 не только присваивает 0 $b, но и дает результат. Этот результат является правой частью присвоения или просто значением, которому присвоено $b.

Итак, $a также присваивается 0.

9 голосов
/ 06 июня 2011

Вы могли бы попробовать это сами

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

или

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

(в настоящее время мне все равно: D)

Таким образом: Нет, они обанезависимые переменные со значением 0.

3 голосов
/ 06 июня 2011

Рекомендую почитать: 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"
}

Итак, выводчто нет ссылки на примитивы, но есть ссылка на объекты.

2 голосов
/ 21 февраля 2015

Зависит от того, что вы назначаете.

Если вы присваиваете значение, то присвоение копирует исходную переменную в новую.

Пример 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 голосов
/ 06 июня 2011

И $ a, и $ b присвоено это значение 0. Если вы хотите, чтобы $ a ссылалось на $ b, вы бы поставили перед ним амперсанд, например:

$a = & $b = 0;

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

1 голос
/ 06 июня 2011

присваивает им значение 0

...