進度條

【PHP】22. 函數的傳入值與預設值 ( function parameters )

【PHP】22. 函數的傳入值與預設值 ( function parameters )

作者: 進度條編輯群 更新日期:

此文章也有影片介紹,可以搭配影片一起學習!

01. 函數的傳入值與預設值 (function and parameters ) (所屬課程)

02. 函數的傳入值與預設值 (function and parameters ) (所屬課程)


以下正式開始文章


關於傳入值(parameter - 亦被稱為參數)

上一堂我們有學到函數的基本概念與寫法,

 

 

<?php

 // 宣告一個叫做do的函數
 function doSomething ( parameter ) {
 
      ...  想要執行的內容 ...
 
 }  // <= 不需要加分號

 doSomething();    // 這裡是執行的時間點
?>

 

 

我們可以利用與宣告與呼叫函數的方式印出內容,例如:

 

<?php
  function echoProgressBar(){
    echo "echo Progress Bar";
  }

  echo echoProgressBar(); 
?>    

 

輸出結果:

echo Progress Bar    

 

不過我們並沒有辦法依照情況更改輸出內容(雖然這個範例其實沒有必要,太簡單了)。總之為了練習與解說,我們還是來改改看吧!

 

首先我們可以看看如果函數的小括號裡放入參數會是怎麼樣的情形,以PHP來說的話就算呼叫函數時參數不給值,
 

<?php

  function echoSomething( $something ){  // 要擺$字號喔!!
    echo $something;
  }

  echoSomething();

?>    

 

輸出結果:

 

 

程式也正常運作,答案是沒有發生任何的事情。不過如果今天給它值,

<?php

  function echoSomething( $something ){
    echo $something;
  }

  echoSomething("Test");
?>    

 

輸出結果:

Test    

它就會照著印出來。

 

那如果嘗試給它兩個值,但是只有一個參數,

<?php

  function echoSomething( $something ){
    echo $something;
  }

  echoSomething("Test","<br/>"); 

?>    

 

輸出結果:

Test    

 

 

還是只能顯示第一個參數的值。

 

PHP的參數寫法基本上跟JavaScript沒有甚麼太大的差異,參數中間用逗點隔開,所以可以這樣寫(參數命名不能相同)
 

<?php

  function echoSomething($something , $something2){
    echo $something.$something2;
  }

  echoSomething ("Test","<br/>")
?>    

 

輸出結果:

 Test

 

 

所以它就可以正常分行了。

如果今天使用同樣的名稱,

 

<?php
  function echoSomething( $something, $something){
    echo $something.$something;
  }

  echoSomething ("Test","<br/>"); 
?>     

 

輸出結果:

 

 

程式會無法被執行。

 

 

函數這名稱從小到大數學課其實聽到有點煩,其中一個讓很多人痛恨的就是f(x)
(唸作 f of x),其中這個「f」其實就是function的縮寫。因此 f(x) = 2x + 1 換成用php寫會變成。

 

function f(x){
  return 2 * x + 1;  
}



因此我們就可以拿它做簡單的數學運算,但是沒有必要自虐取個名稱叫做f的函數,同時間也怕函數名稱重複。所以大家可以試試看下面的例子:

 

 

①若x=10,2x+1等於多少?
 

<?php

  function math2XPlus1($x){
    return 2 * $x + 1;
  }

 echo math2XPlus1(10); 
?>    

 

思路:

1.宣告一個函數math2XPlus1()

2.建立一個參數$x

3.回傳結果return 2 * $x + 1

4.呼叫 math2XPlus1()並帶入參數10

 

輸出結果:

21    

 


②若x=10,y=3,2x+3y+1等於多少?

<?php

  function mathFunction($x, $y){
    return 2 * $x + 3 * $y + 1;
  }

 echo mathFunction(10,3); 
?>    


輸出結果:

30    

 


如果還有更多參數的話(ex:$z),也可以繼續往下加就行了。
 

不過如果呼叫函數時的數只有一個10,也就是把3拿掉的話,會變成甚麼情形呢?
 

<?php

  function mathFunction($x, $y){
    return 2 * $x + 3 * $y + 1;
  }

 echo mathFunction (10); 
?>    


輸出結果:

21    


答案變成了21,為甚麼呢?

我們可以用var_dump()看看$y是甚麼:

<?php
  function mathFunction($x, $y){
    var_dump($y);
    return 2 * $x + 3 * $y + 1;
  }

  echo mathFunction(10); 
?>    


輸出結果:

NULL 21    

 


它是一個null,null在數字的運算裡會被當成0。

                                          

 

接下來我們要講的是傳入值的預設值,就可以避免剛剛的情況。

 

如果今天想要讓$y是一個預設值的話(例如$y=5),可以這樣寫:

<?php
  function mathFunction($x, $y=5){
  var_dump($y);
    return 2 * $x + 3 * $y + 1;
  }

 echo mathFunction(10); 
?>    



輸出結果:

int(5) 36    



我們可以看到$y值5有進去了,回傳結果變成了36,

也就是說如果宣告函數的第二個參數有預設值的話,呼叫函數裡第二個參數就可以不用被輸入,輸出的值就會是預設值。

既然是預設值就代表這個值可以被修改,例如現在我把它改成6,
 

<?php
  function mathFunction($x, $y=5){
  var_dump($y);
  return 2 * $x + 3 * $y + 1;
  }

 echo mathFunction(10,6); 
?>    


輸出結果:

int(6) 39    

 


$y值變成6,回傳結果是36。也就是說預設值只有呼叫函數裡沒有下任何參數的時候才會有反應,即使傳入是NULL,NULL也會蓋掉預設值。
 

<?php
  function mathFunction($x, $y =5){
    var_dump($y);
    return 2 * $x + 3 * $y + 1;
  }

 echo mathFunction (10, NULL); 
?>    


輸出結果:

NULL 21    

 


接著,預設值並不是只能設一個,我們也可以設兩個預設值,
 

<?php

  function mathFunction($x = 3, $y  = 5){
    return 2 * $x + 3 * $y + 1;
  }

 echo mathFunction(); 
?>    


輸出結果:

22    




你可能會想,我乾脆直接把$x = 3, $y = 5放到return裡就好,為什麼還要設參數,設預設值?

 

 

關於這個問題,我們來想一個情境,有三個項目:

 

一個是$title – 標題

一個是$message – 訊息

一個是$level – 等級

如果$level == "Error",標題顯示紅色,否則標題顯示藍色。我們帶入 ("錯誤" , "未知錯誤", ”Error”) 這三個參數看看:

 

<?php

   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”) 這三個參數看看:    

<?php

   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()就不用帶參數了。
 

<?php
   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");
 

<?php
   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")

<?php
   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")

 

<?php
   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 />";
?>    

 


輸出結果:

 

 

程式無法執行,因為不符合語法。因此,如何要設預設值,通常都是設最後一個。

 

<?php
   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粉絲團按讚喔!!

Small logo

進度條編輯群

進度條編輯團隊