2011-06-06 53 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>