函數的參數列表可以是零個或多個,多個用逗號作為分隔符,每一個參數都可以是一個表達式,PHP將自動從左至右依次將表達式求值。
函數參數默認是值傳遞,也就是說你在函數里面改變了參數的值,但不會影響到外部的變量。
// 外部變量
$string = 'hello world';
// 定義函數
function foobar(string $string){
// 我在函數里面修改了$string變量的值
$string .= " ! <br />";
echo $string;
}
// 調用函數、并將$string變量傳過去
foobar($string);
// 打印變量
echo $string;
// 最終輸出
/*
hello world !
hello world
*/
上例中詳細的演示了什么是參數的值傳遞。
再來看看什么是引用傳遞。
// 外部變量
$string = 'hello world';
// 定義函數、參數名前加了 & 引用符號
function foobar(string &$string){
$string .= " ! <br />";
echo $string;
}
// 調用函數
foobar($string);
// 打印變量
echo $string;
// 最終輸出
/*
hello world !
hello world !
*/
參數可以設置默認值,但要注意 **設置了默認值的參數必須放在沒設默認值參數的右邊(→_→) **。
// 定義函數
function foobar(string $arg1, string $arg2 = "default"){
echo "$arg1 $arg2";
}
// 調用函數
foobar("我只傳一個參數");
// 最終輸出
// 我只傳一個參數 default
引用傳值也可以設置默認值
在定義參數的時候,可以聲明參數的類型,如果調用時傳遞過來的參數類型不對,就會報錯,當然,有一些類型會自動進行轉換。
可以通過將參數的默認值設置為 NULL
,來實現允許傳遞 NULL
。
// 定義接口
interface Foo{}
// 定義類
class Bar implements Foo{}
// 定義函數
function example(
// 接口和類
Foo $foo, Bar $bar,
// 數組和可調用
array $arr, callable $call = NULL,
// 標量類型
bool $bool = FALSE, float $float = 3.14, int $num = 468, string $str = "hello"){
// 數據太多就不一一打印了...
echo $str;
}
// 正常調用
example(new Bar(), new Bar(), [1, 2, 3], NULL);
// 給布爾值 傳一個 其他類型的值 過去
// 結果報錯了
example(new Bar(), new Bar(), [1, 2, 3], NULL, NULL);
通過一些設置,可以讓函數調用者必須按照參數的類型來傳值,否則就報錯:
// 啟用嚴格模式
declare(strict_types = 1);
// 定義函數
function example(bool $bool, float $float, int $num, string $str){
// 將參數合并成數組,并打印出來
var_dump(compact('bool', 'float', 'num', 'str'));
}
// 調用函數
example(TRUE, 3.14, 468, "hello");
// 錯誤類型傳遞過去
// 不啟用嚴格模式的情況下會發生自動類型轉換
// 啟用后直接報錯
example("hello", true, 3.14, 468);
嚴格模式的啟用,適合放在你 當前調用函數的文件腳本 中,而不是函數定義的腳本文件中,下面用偽代碼來解釋下這個概念。
// child.php 文件
// 啟用嚴格模式
declare(strict_types = 1);
// 定義函數
function hello(int $num){
echo $num;
}
// parent.php 文件
// 引用文件
include("child.php");
// 調用函數
hello("468我就是不傳 int 值給你");
// 輸出 468
如上面這個例子,子文件中雖然設置了嚴格模式,但是父文件中并沒有設置,而且函數是在父文件中調用的,所以得按照父文件中的模式來,因此嚴格模式并沒有達到預期的效果。
在參數上還有一種應用的方式,叫可變參數,通過三個小數點來表示,看一個簡單的例子:
// 定義函數
function hello(int $num, string ...$strs){
var_dump($strs);
}
// 調用函數
hello(123, 'php', 'asp', 'jsp');
在這個例子中的 $strs
就是一個可變參數,它在這個例子中代表的是一個 成員都是字符串類型的數組,不要錯誤的解讀成字符串類型的數組,PHP里沒有這個東西。
可變參數在使用上有一些需要注意的地方:
- 可變參數只能放在參數列表的最后一位
- 可變參數的前一位參數如果有默認值,那么有可能在調用時發生意想不到的錯誤
在調用函數的時候也可以使用可變參數,如下:
// 求和函數
function sum($x, $y){
return $x + $y;
}
// 輸出 3
echo sum(...[1, 2]);