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

$a = $b = 0; 

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

С сырыми типами это копия.

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

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

 $a = ($b = 0); 

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

Таким образом, $a получает 0 .

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

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

или

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

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

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

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

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

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

 $a = & $b = 0; 

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

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

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

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

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