關於PHP參數的引用傳遞和值傳遞

 

若是但願編寫一個名爲increment()的函數來增長一個變量的值,咱們可能會按以下方式編寫這個函數:函數

這段代碼是沒有用的。下面測試代碼的輸出結果是「10」。測試

$value 的內容沒有被修改。這要歸因於做用域規則。這段代碼將建立一個名爲$value的變量,它的值是10。而後調用函數increment()。當函數被調用 時,它內部的變量$value被建立。它的值加上1,因此$value在函數內部的值爲11,直到函數結束,接下來咱們返回到調用它的代碼。在這段代碼 中,變量$value是一個不一樣的變量,具備全局域,因此它的值沒有變。解決這個問題的一個辦法是將函數內的$value聲明爲全局變量,但這意味着爲了 使用這個函數,要進行變量運算的變量須要被命名爲$value。blog

一般,函數獲取參數的方式是值傳遞。當傳遞一個參數的時候,一個新的而且包含該傳入值的變量被建立。它是原來那個變量的副本。能夠以任意的方式修改它,但函數外部原來變量的值是不會改變的(這是PHP內部所實現的一個微小的簡化)。作用域

更 好的辦法是使用引用傳遞。這裏,在參數被傳遞給函數的時候,函數不會再建立一個新變量,而是函數得到一個原來變量的引用。這個引用有一個變量名稱,它以美 元符號開始,能夠像另外一個變量那樣使用它。其區別在於它不是得到變量自己的值,而是指向原來的值。任何對該引用的修改都會影響到原始變量值。rem

能夠經過在函數定義的參數名前加一個地址符(&)來指定參數的引用傳遞。在函數調用處不用修改。it

前面的increment()的例子就能夠修改成引用傳遞參數,這樣它就能夠正常工做了。class

如今,咱們有了一個可運行的函數,並且能夠任意給想要進行增量運算的變量命名。正如前面所提到過的,在函數的內外使用一樣的名稱會引發混淆,因此咱們給主腳本變量一個新的名稱。以下所示的測試代碼在調用increment()以前將顯示10,調用以後會顯示11。變量

相關文章
相關標籤/搜索