如果希望編寫一個名為increment()的函數來增加一個變量的值,我們可能會按如下方式編寫這個函數:
這段代碼是沒有用的。下面測試代碼的輸出結果是“10”。
$value 的內容沒有被修改。這要歸因於作用域規則。這段代碼將創建一個名為$value的變量,它的值是10。然后調用函數increment()。當函數被調用 時,它內部的變量$value被創建。它的值加上1,所以$value在函數內部的值為11,直到函數結束,接下來我們返回到調用它的代碼。在這段代碼 中,變量$value是一個不同的變量,具有全局域,所以它的值沒有變。解決這個問題的一個辦法是將函數內的$value聲明為全局變量,但這意味着為了 使用這個函數,要進行變量運算的變量需要被命名為$value。
通常,函數獲取參數的方式是值傳遞。當傳遞一個參數的時候,一個新的並且包含該傳入值的變量被創建。它是原來那個變量的副本。可以以任意的方式修改它,但函數外部原來變量的值是不會改變的(這是PHP內部所實現的一個微小的簡化)。
更 好的辦法是使用引用傳遞。這里,在參數被傳遞給函數的時候,函數不會再創建一個新變量,而是函數獲得一個原來變量的引用。這個引用有一個變量名稱,它以美 元符號開始,可以像另一個變量那樣使用它。其區別在於它不是獲得變量本身的值,而是指向原來的值。任何對該引用的修改都會影響到原始變量值。
可以通過在函數定義的參數名前加一個地址符(&)來指定參數的引用傳遞。在函數調用處不用修改。
前面的increment()的例子就可以修改為引用傳遞參數,這樣它就可以正常工作了。
現在,我們有了一個可運行的函數,而且可以任意給想要進行增量運算的變量命名。正如前面所提到過的,在函數的內外使用同樣的名稱會引起混淆,所以我們給主腳本變量一個新的名稱。如下所示的測試代碼在調用increment()之前將顯示10,調用之后會顯示11。