PHP 函式

在本教程中,你將學習如何在 PHP 中建立自己的自定義函式。

PHP 內建函式

函式是執行特定任務的自包含程式碼塊。

PHP 擁有你可以在你的 PHP 指令碼中直接呼叫執行特定任務的內部或內建函式的巨大集合,如 gettype()print_r()var_dump 等。

PHP 使用者定義的函式

除了內建函式,PHP 還允許你定義自己的函式。這是一種建立可重用程式碼包的方法,可以執行特定任務,並且可以與主程式分開儲存和維護。以下是使用函式的一些優點:

  • 函式減少了程式中程式碼的重複 - 函式允許你將常用的程式碼塊提取到單個模組中。現在,你可以通過在指令碼中的任何位置呼叫此函式來執行相同的任務,而無需一次又一次地複製和貼上相同的程式碼塊。
  • 函式使程式碼更易於維護 - 由於建立一次的函式可以多次使用,因此在函式內部進行的任何更改都會在所有位置自動實現,而不會觸及多個檔案。
  • 函式可以更容易地消除錯誤 - 當程式細分為函式時,如果發生任何錯誤,你確切知道導致錯誤的函式以及在何處找到錯誤。因此,修復錯誤變得更加容易。
  • 函式可以在其他應用程式中重用 - 因為函式與指令碼的其餘部分是分開的,只需包含包含這些函式的 php 檔案,就可以很容易地在其他應用程式中重用相同的函式。

以下部分將向你展示如何輕鬆地在 PHP 中定義自己的函式。

PHP 建立和呼叫函式

建立自定義函式的基本語法可以通過以下方式獲得:

function functionName(){ // Code to be executed } 

使用者定義函式的宣告以單詞 function 開頭,後跟要建立的函式的名稱,後跟括號,即 (),最後將函式的程式碼放在大括號 {} 之間。

這是一個使用者定義函式的簡單示例,顯示今天的日期:

<?php
// Defining function
function whatIsToday(){
    echo "Today is " . date('l', mktime());
}
// Calling function
whatIsToday();
?>

注意: 函式名稱必須以字母或下劃線字元開頭,而不是數字,後面可跟更多的字母,數字或下劃線字元。函式名稱不區分大小寫。

PHP 帶引數的函式

定義函式以在執行時接受輸入值時,可以指定引數。引數的作用類似於函式中的佔位符變數; 它們在執行時被呼叫時提供給函式的值(稱為引數)替換。

function myFunc($oneParameter, $anotherParameter){ // Code to be executed } 

你可以根據需要定義任意數量的引數。但是,對於你指定的每個引數,在呼叫函式時需要將相應的引數傳遞給函式。

以下示例中的 getSum() 函式將兩個整數值作為引數,只需將它們相加,然後在瀏覽器中顯示結果。

<?php
// Defining function
function getSum($num1, $num2){
  $sum = $num1 + $num2;
  echo "Sum of the two numbers $num1 and $num2 is : $sum";
}
 
// Calling function
getSum(10, 20);
?>

上面程式碼的輸出將是:

Sum of the two numbers 10 and 20 is : 30

具有可選引數和預設值的函式

你還可以使用可選引數建立函式 - 只需插入引數名稱,然後輸入等號(=),後跟預設值,如下所示。

<?php
// Defining function
function customFont($font, $size=1.5){
    echo "<p style=\"font-family: $font; font-size: {$size}em;\">Hello, world!</p>";
}
 
// Calling function
customFont("Arial", 2);
customFont("Times", 3);
customFont("Courier");
?>

正如你所看到的,第三個呼叫 customFont() 不包括第二個引數。這會導致 PHP 引擎使用引數 $size 的預設值 1.5。

從函式返回值

函式可以使用 return 語句將值返回給呼叫函式的指令碼。該值可以是任何型別,包括陣列和物件。

<?php
// Defining function
function getSum($num1, $num2){
    $total = $num1 + $num2;
    return $total;
}
 
// Printing returned value
echo getSum(5, 10); // Outputs: 15
?>

函式不能返回多個值。但是,你可以通過返回陣列來獲得類似的結果,如以下示例所示。

<?php
// Defining function
function divideNumbers($dividend, $divisor){
    $quotient = $dividend / $divisor;
    $array = array($dividend, $divisor, $quotient);
    return $array;
}
 
// Assign variables as if they were an array
list($dividend, $divisor, $quotient) = divideNumbers(10, 2);
echo $dividend;  // Outputs: 10
echo $divisor;   // Outputs: 2
echo $quotient;  // Outputs: 5
?>

通過引用將引數傳遞給函式

在 PHP 中,有兩種方法可以將引數傳遞給函式: 按值引用。預設情況下,函式引數按值傳遞,這樣如果函式中的引數值發生更改,則不會在函式外部受到影響。但是,要允許函式修改其引數,必須通過引用傳遞它們。

通過引用傳遞引數是通過在函式定義中的引數名稱前加一個 & 符號來完成的,如下例所示:

<?php
/* Defining a function that multiply a number
by itself and return the new value */
function selfMultiply(&$number){
    $number *= $number;
    return $number;
}
 
$mynum = 5;
echo $mynum; // Outputs: 5
 
selfMultiply($mynum);
echo $mynum; // Outputs: 25
?>

PHP 變數範圍

你可以在 PHP 指令碼中的任何位置宣告變數。但是,宣告的位置決定了變數在 PHP 程式中的可見性範圍,即可以使用或訪問變數的位置。此可訪問性稱為變數範圍

預設情況下,函式內宣告的變數是本地的,不能從該函式外部檢視或操作它們,如下例所示:

<?php
// Defining function
function test(){
    $greet = "Hello World!";
    echo $greet;
}
 
test(); // Outputs: Hello World!
 
echo $greet; // Generate undefined variable error
?>

同樣,如果你嘗試訪問或匯入函式內部的外部變數,你將收到未定義的變數錯誤,如以下示例所示:

<?php
$greet = "Hello World!";
 
// Defining function
function test(){
    echo $greet;
}
 
test();  // Generate undefined variable error
 
echo $greet; // Outputs: Hello World!
?>

正如你在上面的示例中所看到的,函式內部宣告的變數無法從外部訪問,同樣在函式內部宣告的變數也無法在函式內部訪問。這種分離降低了函式中變數受主程式中變數影響的可能性。

提示: 可以在不同函式中為變數重用相同的名稱,因為區域性變數只能由宣告它們的函式識別。

全域性關鍵字

可能存在需要將主程式中的變數匯入函式的情況,反之亦然。在這種情況下,你可以在函式內部的變數之前使用 global 關鍵字。此關鍵字將變數轉換為全域性變數,使其在函式內部和外部都可見或可訪問,如下例所示:

<?php
$greet = "Hello World!";
 
// Defining function
function test(){
    global $greet;
    echo $greet;
}
 
test(); // Outpus: Hello World!
echo $greet; // Outpus: Hello World!
 
// Assign a new value to variable
$greet = "Goodbye";
 
test(); // Outputs: Goodbye
echo $greet; // Outputs: Goodbye
?>

你將在 PHP 類和物件 章節中瞭解有關可見性和訪問控制的更多資訊。

建立遞迴函式

遞迴函式是一種一次又一次呼叫自身直到滿足條件的函式。遞迴函式通常用於解決複雜的數學計算,或處理深層巢狀的結構,例如,列印深層巢狀陣列的所有元素。

以下示例演示了遞迴函式的工作原理。

<?php
// Defining recursive function
function printValues($arr) {
    global $count;
    global $items;
    
    // Check input is an array
    if(!is_array($arr)){
        die("ERROR: Input is not an array");
    }
    
    /*
    Loop through array, if value is itself an array recursively call the
    function else add the value found to the output items array,
    and increment counter by 1 for each value found
    */
    foreach($arr as $a){
        if(is_array($a)){
            printValues($a);
        } else{
            $items[] = $a;
            $count++;
        }
    }
    
    // Return total count and values found in array
    return array('total' => $count, 'values' => $items);
}
 
// Define nested array
$species = array(
    "birds" => array(
        "Eagle",
        "Parrot",
        "Swan"
    ),
    "mammals" => array(
        "Human",
        "cat" => array(
            "Lion",
            "Tiger",
            "Jaguar"
        ),
        "Elephant",
        "Monkey"
    ),
    "reptiles" => array(
        "snake" => array(
            "Cobra" => array(
                "King Cobra",
                "Egyptian cobra"
            ),
            "Viper",
            "Anaconda"
        ),
        "Crocodile",
        "Dinosaur" => array(
            "T-rex",
            "Alamosaurus"
        )
    )
);
 
// Count and print values in nested array
$result = printValues($species);
echo $result['total'] . ' value(s) found: ';
echo implode(', ', $result['values']);
?>

注意: 建立遞迴函式時要小心,因為如果程式碼寫得不正確,可能會導致函式呼叫無限迴圈。