2009-07-09 49 views
12

在此代碼:PHP中的對象是通過值還是引用傳遞的?

<?php 
class Foo 
{ 
    var $value; 

    function foo($value) 
    { 
     $this->setValue($value); 
    } 

    function setValue($value) 
    { 
     $this->value=$value; 
    } 
} 

class Bar 
{ 
    var $foos=array(); 

    function Bar() 
    { 
     for ($x=1; $x<=10; $x++) 
     { 
      $this->foos[$x]=new Foo("Foo # $x"); 
     } 
    } 

    function getFoo($index) 
    { 
     return $this->foos[$index]; 
    } 

    function test() 
    { 
     $testFoo=$this->getFoo(5); 
     $testFoo->setValue("My value has now changed"); 
    } 
} 
?> 

當該方法Bar::test()運行和它FOO的對象的陣列中的改變的FOO#5的值,將所述陣列中的實際FOO#5受到影響,或者將所述$testFoo變量只能是一個局部變量,它將在函數結尾處不再存在?

+1

相關問題:http://stackoverflow.com/questions/879/php-variables-passed-by-value-or-by-reference。 – TSomKes 2009-07-09 23:54:43

回答

20

爲什麼不運行該函數並找出?通過

Foo #5 
My value has now changed 

這不是由於「通過引用傳遞」,但是,它是由於「轉讓:

$b = new Bar; 
echo $b->getFoo(5)->value; 
$b->test(); 
echo $b->getFoo(5)->value; 

對於我上面的代碼(與您的代碼一起)產生的該輸出參考」。在PHP 5中,按引用分配是對象的默認行爲。如果您想要按值分配,請使用clone關鍵字。

+0

在php 4上發生了什麼? – 2009-07-10 00:25:10

4

它們的價值由PHP 4,並通過引用在PHP 5中傳遞爲了通過在PHP 4的參考對象,你必須明確地將其標記爲這樣:

$obj = &new MyObj; 
10

你可以參考http://ca2.php.net/manual/en/language.oop5.references.php爲您的問題的實際答案。

經常提到的PHP5 OOP的一個關鍵點是「對象通過默認引用傳遞」。這並不完全正確。

PHP引用是一個別名,它允許兩個不同的變量寫入相同的值。從PHP5開始,對象變量不再包含對象本身作爲值。它只包含一個對象標識符,它允許對象訪問器找到實際的對象。當一個對象被參數發送,返回或分配給另一個變量時,不同的變量不是別名:它們包含指向同一對象的標識符的副本。

相關問題