$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
。
0
,因此无论如何都是正确的 :) - KingCrunch所以,我个人建议您分别分配变量。需要注意的是,如果你在一行上使用多个赋值操作符来分配对象,那么该对象将被分配为引用。因此,如果您使用任何一个变量来更改对象的属性值,则该值实际上会在两个变量中同时更改。
$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"
}
如果你正在进行赋值操作,则该赋值会将原变量复制到新变量中。
示例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.
$a = $b = $c = new DOMdocument();
$c->appendChild($c->createElement('html'));
echo $a->saveHTML();
<html></html>
。变量 $a 和 $b 都被赋值为 0。如果你想让 $a 引用 $b,你需要在 $a 前加上一个 & 符号,例如:
$a = & $b = 0;
它将它们都赋值为0
clone
可以将对象的引用赋值更改为复制赋值。例如:$a = clone $b = new Obj;
- Will B.private $_name = $address = "";
- Chaminda Bandara