2011-06-06 74 views

回答

41

随着原料类型两者的值,这是一个拷贝。

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

请注意,该示例具有误导性:更改对象的属性与更改引用对象的变量不同。因为变量从未改变过,所以当然是相同的。 – KingCrunch 2011-12-30 19:00:51

+1

根据[documentation](http://php.net/manual/en/internals2.variables.intro.php),PHP使用写入系统上的副本。这意味着使用诸如字符串或整数等原始类型真的会在内存中创建更改。这就是为什么,与我们想像的相反,创建引用来优化小变量的性能可能不会带来预期的效果,因为PHP需要在之前创建它。但是,自PHP5以来,对象通过默认引用进行传递。 – bgondy 2013-04-11 17:00:38

+3

通过引用分配对象可以更改为使用'clone'复制分配。EG:'$ a = clone $ b = new Obj;' – fyrye 2016-03-31 21:17:38

9

你可以自己已经尝试过

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

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

(目前我真的不关心:d)

这样:不,它们与价值两个独立变量0

+0

在那个例子中,你是不是必须在第二行分配5到$ b来证明引用不存在?是的,你是对的。我认为这里的问题对于其他人来说也很好,但是... – 2011-06-06 19:47:12

+0

@Evil:不想考虑它,所以也加入了其他方法。两者都返回'0',因此它在任何情况下都必须是真实的:) – KingCrunch 2011-06-06 19:49:13

+0

今天我学到了一些东西。它可能很小,但总是很有趣。 – 2011-06-06 19:54:46

18

关于此代码为:

$a = ($b = 0); 

表达$b = 0不仅分配0$b,但它产生的结果为好。该结果是作业的正确部分,或者仅仅是$b分配给的值。

因此,$a也被指定为0

3

我给你推荐这个很好看的: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" 
} 

所以结论是没有对基元的引用,但是有一个对象的引用。

+0

我们在一些测试中证明了这个错误。 – 2011-06-06 20:15:50

+0

我已经更新了我的答案。 – 2011-06-06 20:26:16

2

它取决于你分配什么。

如果您正在分配一个值,则该分配会将原始变量复制到新的值。

例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>