【PHP】22. 函數的傳入值與預設值 ( function parameters )
【PHP】22. 函數的傳入值與預設值 ( function parameters )
此文章也有影片介紹,可以搭配影片一起學習!
01. 函數的傳入值與預設值 (function and parameters ) (所屬課程)
關於傳入值(parameter - 亦被稱為參數)
上一堂我們有學到函數的基本概念與寫法,
// 宣告一個叫做do的函數
function doSomething ( parameter ) {
... 想要執行的內容 ...
} // <= 不需要加分號
doSomething(); // 這裡是執行的時間點
?>
我們可以利用與宣告與呼叫函數的方式印出內容,例如:
function echoProgressBar(){
echo "echo Progress Bar";
}
echo echoProgressBar();
?>
輸出結果:
不過我們並沒有辦法依照情況更改輸出內容(雖然這個範例其實沒有必要,太簡單了)。總之為了練習與解說,我們還是來改改看吧!
首先我們可以看看如果函數的小括號裡放入參數會是怎麼樣的情形,以PHP來說的話就算呼叫函數時參數不給值,
function echoSomething( $something ){ // 要擺$字號喔!!
echo $something;
}
echoSomething();
?>
輸出結果:
程式也正常運作,答案是沒有發生任何的事情。不過如果今天給它值,
function echoSomething( $something ){
echo $something;
}
echoSomething("Test");
?>
輸出結果:
它就會照著印出來。
那如果嘗試給它兩個值,但是只有一個參數,
function echoSomething( $something ){
echo $something;
}
echoSomething("Test","<br/>");
?>
輸出結果:
還是只能顯示第一個參數的值。
PHP的參數寫法基本上跟JavaScript沒有甚麼太大的差異,參數中間用逗點隔開,所以可以這樣寫(參數命名不能相同)
function echoSomething($something , $something2){
echo $something.$something2;
}
echoSomething ("Test","<br/>");
?>
輸出結果:
所以它就可以正常分行了。
如果今天使用同樣的名稱,
function echoSomething( $something, $something){
echo $something.$something;
}
echoSomething ("Test","<br/>");
?>
輸出結果:
程式會無法被執行。
函數這名稱從小到大數學課其實聽到有點煩,其中一個讓很多人痛恨的就是f(x)
(唸作 f of x),其中這個「f」其實就是function的縮寫。因此 f(x) = 2x + 1 換成用php寫會變成。
return 2 * x + 1;
}
因此我們就可以拿它做簡單的數學運算,但是沒有必要自虐取個名稱叫做f的函數,同時間也怕函數名稱重複。所以大家可以試試看下面的例子:
①若x=10,2x+1等於多少?
function math2XPlus1($x){
return 2 * $x + 1;
}
echo math2XPlus1(10);
?>
思路:
1.宣告一個函數math2XPlus1()
2.建立一個參數$x
3.回傳結果return 2 * $x + 1
4.呼叫 math2XPlus1()並帶入參數10
輸出結果:
②若x=10,y=3,2x+3y+1等於多少?
function mathFunction($x, $y){
return 2 * $x + 3 * $y + 1;
}
echo mathFunction(10,3);
?>
輸出結果:
如果還有更多參數的話(ex:$z),也可以繼續往下加就行了。
不過如果呼叫函數時的數只有一個10,也就是把3拿掉的話,會變成甚麼情形呢?
function mathFunction($x, $y){
return 2 * $x + 3 * $y + 1;
}
echo mathFunction (10);
?>
輸出結果:
答案變成了21,為甚麼呢?
我們可以用var_dump()看看$y是甚麼:
function mathFunction($x, $y){
var_dump($y);
return 2 * $x + 3 * $y + 1;
}
echo mathFunction(10);
?>
輸出結果:
它是一個null,null在數字的運算裡會被當成0。
接下來我們要講的是傳入值的預設值,就可以避免剛剛的情況。
如果今天想要讓$y是一個預設值的話(例如$y=5),可以這樣寫:
function mathFunction($x, $y=5){
var_dump($y);
return 2 * $x + 3 * $y + 1;
}
echo mathFunction(10);
?>
輸出結果:
我們可以看到$y值5有進去了,回傳結果變成了36,
也就是說如果宣告函數的第二個參數有預設值的話,呼叫函數裡第二個參數就可以不用被輸入,輸出的值就會是預設值。
既然是預設值就代表這個值可以被修改,例如現在我把它改成6,
function mathFunction($x, $y=5){
var_dump($y);
return 2 * $x + 3 * $y + 1;
}
echo mathFunction(10,6);
?>
輸出結果:
$y值變成6,回傳結果是36。也就是說預設值只有呼叫函數裡沒有下任何參數的時候才會有反應,即使傳入是NULL,NULL也會蓋掉預設值。
function mathFunction($x, $y =5){
var_dump($y);
return 2 * $x + 3 * $y + 1;
}
echo mathFunction (10, NULL);
?>
輸出結果:
接著,預設值並不是只能設一個,我們也可以設兩個預設值,
function mathFunction($x = 3, $y = 5){
return 2 * $x + 3 * $y + 1;
}
echo mathFunction();
?>
輸出結果:
你可能會想,我乾脆直接把$x = 3, $y = 5放到return裡就好,為什麼還要設參數,設預設值?
關於這個問題,我們來想一個情境,有三個項目:
一個是$title – 標題
一個是$message – 訊息
一個是$level – 等級
如果$level == "Error",標題顯示紅色,否則標題顯示藍色。我們帶入 ("錯誤" , "未知錯誤", ”Error”) 這三個參數看看:
function notify($title, $message, $level){
if ($level == "Error"){
echo "<h1 style='color: red;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
} else {
echo "<h1 style='color: blue;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}
}
notify("錯誤" , "未知錯誤", "Error");
echo "<br/>";
?>
輸出結果:
如果改成 (“通知" , "已知錯誤",”Info”) 這三個參數看看:
function notify($title, $message, $level){
if ($level == "Error"){
echo "<h1 style='color: red;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}else{
echo "<h1 style='color: blue;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}
}
notify("通知","未知錯誤","Info");
echo "<br />";
?>
輸出結果:
那我們會想如果大部分的時候 $level = "Error",$message = "未知錯誤",$title = "錯誤"的話,我們是不是可以把這些都設預設值呢?這樣notify()就不用帶參數了。
function notify($title ="錯誤", $message ="未知錯誤", $level ="Error"){
if ($level == "Error"){
echo "<h1 style='color: red;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}else{
echo "<h1 style='color: blue;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}
}
notify();
echo "<br />";
?>
輸出結果:
不過這種設定方式會出現一個問題,如果我只想改第二個$message,這是沒有辦法做到的。
例如我的第一個值我不想設,但又必須帶值,所以帶NULL試試,第二個參數帶入”已知錯誤1”,第三個參數不帶值,像這樣:
notify(NULL, "已知錯誤1");
function notify($title ="錯誤", $message ="未知錯誤", $level ="Error"){
if ($level == "Error"){
echo "<h1 style='color: red;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}else{
echo "<h1 style='color: blue;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}
}
notify(NULL, "已知錯誤1");
echo "<br />";
?>
輸出結果:
NULL還是被帶進去了。而無論我帶什麼值,像這樣:
notify(“111”, "已知錯誤1")
function notify($title ="錯誤", $message ="未知錯誤", $level ="Error"){
if ($level == "Error"){
echo "<h1 style='color: red;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}else{
echo "<h1 style='color: blue;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}
}
notify("111", "已知錯誤1");
echo "<br />";
?>
輸出結果:
都會被改變。如果第一個不帶值,像這樣:
notify( , "已知錯誤1")
function notify($title ="錯誤", $message ="未知錯誤", $level ="Error"){
if ($level == "Error"){
echo "<h1 style='color: red;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}else{
echo "<h1 style='color: blue;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}
}
notify(, "已知錯誤1");
echo "<br />";
?>
輸出結果:
程式無法執行,因為不符合語法。因此,如何要設預設值,通常都是設最後一個。
function notify($title, $message, $level ="Error"){
if ($level == "Error"){
echo "<h1 style='color: red;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}else{
echo "<h1 style='color: blue;'>{$title}</h1>";
echo "<h2>{$message}</h2>";
}
}
notify(錯誤, "已知錯誤1");
echo "<br />";
?>
輸出結果:
結論:如果參數有設「預設值」通常都會是最後一個值
寫程式寫久了也會常常會看人家的程式碼還有自己以前寫的程式碼,如果看到最後一個參數有設預設值的時候,就會知道這個值並不是真的那麼的重要。如果看到沒有設預設值的參數,就知道要傳值進去。因此光看參數命名方式也是可以得到很多的資訊。
因此請大家要好好的命名啊!
最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!