Выполняются ли множественные назначения переменных по значению или ссылке?

$a = $b = 0;

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

Ответ 1

С исходными типами это копия.

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

Ответ 2

Обратите внимание на этот код как:

$a = ($b = 0);

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

Итак, $a также получает 0.

Ответ 3

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

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

или

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

(в настоящее время я действительно не забочусь: D)

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

Ответ 4

Я порекомендую хорошо прочитать об этом: 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"
}

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

Ответ 5

Оба $a и $b присваиваются этому значению 0. Если вы хотите, чтобы $a ссылался на $b, вы вытеснили бы его амперсандом, например:

$a = & $b = 0;

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

Ответ 6

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

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

Пример 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>.

Ответ 7

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