Evi*_*Elf 36 php variables variable-assignment
$a = $b = 0;
Run Code Online (Sandbox Code Playgroud)
在上面的代码,都$a和$b指定的值0,或者是$a只引用$b?
Bob*_*neu 48
对于原始类型,这是一个副本.
test.php的
$a = $b = 0;
$b = 3;
var_dump($a);
var_dump($b);
Run Code Online (Sandbox Code Playgroud)
输出:
int(0)
int(3)
Run Code Online (Sandbox Code Playgroud)
但是对于对象,这是另一个故事(PHP 5)
test.php的
class Obj
{
public $_name;
}
$a = $b = new Obj();
$b->_name = 'steve';
var_dump($a);
var_dump($b);
Run Code Online (Sandbox Code Playgroud)
产量
object(Obj)#1 (1) { ["_name"]=> string(5) "steve" }
object(Obj)#1 (1) { ["_name"]=> string(5) "steve" }
Run Code Online (Sandbox Code Playgroud)
Bla*_*iev 18
将此代码视为:
$a = ($b = 0);
Run Code Online (Sandbox Code Playgroud)
表达$b = 0不仅分配0到$b,但它产生的结果为好.该结果是赋值的正确部分,或者仅仅是赋值的值$b.
所以,也$a被分配0了.
你可以自己尝试一下
$a = $b = 0;
$a = 5;
echo $b;
Run Code Online (Sandbox Code Playgroud)
要么
$a = $b = 0;
$b = 5;
echo $a;
Run Code Online (Sandbox Code Playgroud)
(目前我真的不在乎: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);
Run Code Online (Sandbox Code Playgroud)
产量:
int(4)
int(4)
int(4)
int(5)
Run Code Online (Sandbox Code Playgroud)
但:
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);
Run Code Online (Sandbox Code Playgroud)
产量:
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"
}
Run Code Online (Sandbox Code Playgroud)
所以结论是没有对原语的引用,但有对对象的引用。