這部分要談到的是 PHP 的函式
我會分成 6 的小節來介紹~
- 自定義函式
- 參數
- 回傳值
- 變數函式
- 內建函式
- 匿名函式
自定義函式
最常用的大概就是自定義函式了
我們可以使用 function 這個關鍵字去定義一個函式
特別要注意的是!!!
只要在 PHP 的範圍裡面有定義的函式,都可以呼叫
沒有一定要前面先定義好,才可以在後面呼叫,反過來先呼叫再定義也是可以正常執行的!
1 | function callOne(){ |
參數
在呼叫函式的時候,也可以從函式外傳遞參數到函式裡面執行
而可以細分為3個部分,分別是
- 傳值
- 傳參考
- 預設值
PHP 是沒有指標的喔~ 所以只有傳值和傳參考的方式!
1. 傳值
傳值的方式顧名思義就是將數值傳遞進去
所以會將原先的變數複製一份當作參數傳遞到函式中
在函式裡面做的任何修改都不會影響到原來的數值
這當然是有前提的!
並不是所有用傳值方式傳遞的參數,在經過修改後都不會影響到原數值! (馬上打臉自己…)
因為雖然變數都有各自分配的記憶體空間,但不是每一個都直接到記憶體空間取值~
像是物件,PHP 會使用一個辨識碼,辨識碼可以辨識物件的記憶體位置
像在這種情況下進行複製時,複製的是那個辨識碼,所以說實際上還是只有一個記憶體空間~
所以修改的時候,還是會影響到原本的數值~
有點抽象 (汗…),還是趕緊來看下面的範例吧~
1 | function call_value($var){ |
2. 傳參考
傳參考和傳值不同的地方在於…
兩者都是相同的記憶體位置,所以當參數被修改時,原變數的數值也會被更動
而使用的方式是用一個 & (取址符號) 接在參數的前面
另外像前面提過的…
有些變數可以在不使用取址符號的情況下達到傳參考的方式
但在一般使用的時候,還是加上符號會比較好,避免使用上的混淆~
1 | function call_value(&$var){ |
3. 預設值
在指定函式參數的時候,可以指派預設值給參數
而在呼叫有預設值參數的函式時,我們可以不傳遞該參數給函式
函式會使用預設值來執行內部的程式碼
換句話說,如果我們有傳遞參數給函式的話,函式就會使用我們傳遞的參數去執行內部程式碼~
特別要注意的是!!!
從指派預設值的參數開始,後面每個都必須有預設值,在呼叫函式時才不會發生錯誤~
1 | function compare($target, $param){ |
回傳值
在前面的章節曾經提過 return 這個關鍵字
簡單來說,return 不僅可以中斷整個 PHP 腳本的執行,當用在函式裡面的時候,也可以用來回傳某一個數值 (當然也可以什麼都不回傳)
1 | function getSquareValue($var){ |
另外~
雖然 PHP 可以不需要事前指定變數或回傳的型態
不過在函式中,你仍然可以指定函式回傳值的型態
當回傳值的型態不符合指定時,就會發生錯誤
而指定的方法就是在包函參數的中括號後面接上一個冒號 + 指定的型態
可以參考下方範例~
1 | function getSquareValue($var):string{ |
變數函式
關於變數韓式的這個部分,我認為是 PHP 當中一個很好玩的特性~
當在某個變數的後面加上表是函式的 () 中括號之後
PHP 會去尋找是否有符合變數數值的函式,並試圖執行它
特別要注意!
這不適用於每個函式,像是 echo、print、require、include…這一類的都不適用
所以如果真的要使用的話,我認為用在自定義的函式上是比較恰當的~
1 | function test(){ |
內建函式
顧名思義就是本來就存在 PHP 當中的函式
因此不需要另外在定義就可以直接呼叫使用
不過換句話說
傳遞的參數也必需要符合定義才行,不然就會回傳 undefined 的錯誤~
像是..
可以使用 mysqli_connect() 來連結 mysql 資料庫.. 等等
匿名函式
最後則是要提到匿名函式的部分~
在前面的範例中可以看到,不管是自定義還是內建的函式都會帶有一個名稱
而我們可以使用名稱去呼叫對應的函式
而這個章節就是要說,其實我們也可以定義一個沒有名稱的函式~
常見的有兩種
- 建立一個匿名的函式,然後把它當成參數傳遞到某個函式裡
- 將某個匿名的函式丟給一個變數,這時候變數就會等於匿名函式
聽起來有點饒舌
所以直接來看看下面的範例說明吧!
1 | $func = function($name = 'Jason'){ |
特別要注意,將匿名函式指派給變數之後,不要忘記加上;(分號)~