$a = $b = 0;
В вышеприведенном коде оба $a
и $b
назначают значение 0
, или $a
просто ссылаются на $b
?
$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