$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;
Это зависит от того, что вы назначаете.
Если вы назначаете значение, то присваивание копирует исходную переменную в новую.
Пример 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