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']);
?>
注意: 建立遞迴函式時要小心,因為如果程式碼寫得不正確,可能會導致函式呼叫無限迴圈。