2017-01-10 63 views
-1

我有簡單的代碼:PHP - 傳遞參數的功能

class A { 
    public $var = 1; 
    function inc() {$this->var++;} 
} 

function foo($a) { 
    for($i = 0; $i < 10; $i++) { 
     $a->inc(); 
    } 
} 

$a = new A(); 
foo($a); 

$v = $a->var; 
echo "var value is $v \n"; 

我期待得到印刷的1的價值,但我得到11 不應該PHP通的說法與拷貝構造函數?

+2

爲什麼你會得到1,因爲你已經調用了循環來迭代10次 –

+0

我想他想知道的是'$ a'在函數的局部範圍內被操作,'$ v'是在全局範圍內訪問'$ a-> var',並且因此應該具有初始值'1'而不是'11' ...簡短的回答是,*它不起作用,但是我想想我可以看到他來自哪裏。 – CD001

+0

[PHP的變量是通過值還是通過引用傳遞的]可能的重複?(http://stackoverflow.com/questions/879/are-php-variables-passed-by-value-or-by-reference) – Winter

回答

1

PHP確實有一個拷貝構造函數,但它複製的很淺,所以傳遞給foo的對象是一個新副本,但它具有對$ var的引用,它指向與$ a-> var相同的值。 如果你已經完成了 富(克隆($ a)) 那麼你會得到你所期望的答案。

0

你已經有$var=1,你每增加10次。這意味着您的for循環會運行10次,並會因class A inc method中的$this->var++而增加。所以爲了得到你的結果,你的$var應該等於-9,否則你應該設置for循環運行一次,並且默認將$var的值設置爲0。