在本教程中,您將學(xué)習(xí)如何在PHP中創(chuàng)建自己的自定義函數(shù)。
函數(shù)是執(zhí)行特定任務(wù)的獨(dú)立代碼塊。
PHP有一個(gè)巨大的集合內(nèi)置函數(shù),你可以在你的PHP腳本中直接調(diào)用執(zhí)行特定的任務(wù),如:gettype(),print_r(),var_dump等。
請(qǐng)查看PHP參考部分,以獲得有用的PHP內(nèi)置函數(shù)的完整列表。
除了內(nèi)置函數(shù),PHP還允許您定義自己的函數(shù)。這是創(chuàng)建執(zhí)行特定任務(wù)的可重用代碼包的一種方法,并且可以與主程序分開保存和維護(hù)。以下是使用函數(shù)的一些優(yōu)點(diǎn):
函數(shù)減少了程序中代碼的重復(fù) - 函數(shù)允許您將常用的代碼塊提取到單個(gè)組件中?,F(xiàn)在,您可以通過在腳本中的任何位置調(diào)用此函數(shù)來執(zhí)行相同的任務(wù),而不必反復(fù)復(fù)制和粘貼相同的代碼塊。
函數(shù)使代碼的維護(hù)更加容易 - 由于一次創(chuàng)建函數(shù)可以多次使用,因此在函數(shù)內(nèi)部進(jìn)行的任何更改都會(huì)在所有位置自動(dòng)實(shí)現(xiàn),而無需修改多個(gè)文件。
通過函數(shù)可以更輕松地消除錯(cuò)誤 - 將程序細(xì)分為函數(shù)時(shí),如果發(fā)生任何錯(cuò)誤,您將確切知道是哪個(gè)函數(shù)導(dǎo)致了錯(cuò)誤以及在哪里可以找到它。因此,修復(fù)錯(cuò)誤變得容易得多。
可以在其他應(yīng)用程序中重用功能 - 由于函數(shù)與腳本的其余部分是分開的,因此僅通過包含包含這些函數(shù)的php文件,就可以在其他應(yīng)用程序中輕松重復(fù)使用相同的功能。
下一節(jié)將向您展示如何輕松地在PHP中定義自己的函數(shù)。
創(chuàng)建自定義函數(shù)的基本語法可以給出:
function functionName(){
//要執(zhí)行的代碼
}用戶定義函數(shù)的聲明以單詞function開頭,后跟要?jiǎng)?chuàng)建的函數(shù)的名稱,再后跟括號(hào),即(),最后將函數(shù)的代碼放在大括號(hào)之間{ }。
這是一個(gè)用戶定義函數(shù)的簡單示例,其中顯示了今天的日期:
<?php
//定義函數(shù)
function whatIsToday(){
echo "Today is " . date('l', mktime());
}
//調(diào)用函數(shù)
whatIsToday();
?>測試看看?/?注意:函數(shù)名稱必須以字母或下劃線字符開頭,而不以數(shù)字開頭,還可以選擇后面跟有更多字母,數(shù)字或下劃線字符。函數(shù)名稱不區(qū)分大小寫。
您可以在定義函數(shù)以在運(yùn)行時(shí)接受輸入值時(shí)指定參數(shù)。 參數(shù)的工作方式類似于函數(shù)中的占位符變量;它們?cè)谶\(yùn)行時(shí)被調(diào)用時(shí)提供給函數(shù)的值(稱為參數(shù))替換。
function myFunc($oneParameter,$anotherParameter){
//要執(zhí)行的代碼
}您可以根據(jù)需要定義任意多個(gè)參數(shù)。 但是,對(duì)于您指定的每個(gè)參數(shù),在調(diào)用函數(shù)時(shí)需要將相應(yīng)的參數(shù)傳遞給該函數(shù)。
以下示例中的getSum()函數(shù)將兩個(gè)整數(shù)值作為參數(shù),只需將它們加在一起,然后在瀏覽器中顯示結(jié)果。
<?php
//定義函數(shù)
function getSum($num1, $num2){
$sum = $num1 + $num2;
echo "兩個(gè)數(shù)字$num1和$num2的和是 : $sum";
}
//調(diào)用函數(shù)
getSum(10, 20);
?>測試看看?/?上面代碼的輸出將是:
兩個(gè)數(shù)字10和20的和是 : 30
提示:參數(shù)是您傳遞給函數(shù)的值,參數(shù)是函數(shù)中接收參數(shù)的變量。但是,在通常用法中,這些術(shù)語是可以互換的,即參數(shù)是自變量。
您也可以創(chuàng)建帶有可選參數(shù)的函數(shù) - 只需插入?yún)?shù)名稱,后跟等號(hào)(=),然后是默認(rèn)值,如下所示。
<?php
//定義函數(shù)
function customFont($font, $size=1.5){
echo "<p style=\"font-family: $font; font-size: {$size}em;\">Hello, world!</p>";
}
//調(diào)用函數(shù)
customFont("Arial", 2);
customFont("Times", 3);
customFont("Courier");
?>測試看看?/?正如您可以看到的,對(duì) customFont ()的第三個(gè)調(diào)用不包括第二個(gè)參數(shù)。這將導(dǎo)致 PHP 引擎使用 $size 參數(shù)的默認(rèn)值,即1.5。
函數(shù)可以使用return語句將值返回給調(diào)用該函數(shù)的腳本。該值可以是任何類型,包括數(shù)組和對(duì)象。
<?php
//定義函數(shù)
function getSum($num1, $num2){
$total = $num1 + $num2;
return $total;
}
//打印返回值
echo getSum(5, 10); // 輸出: 15
?>測試看看?/?一個(gè)函數(shù)不能返回多個(gè)值。但是,您可以通過返回一個(gè)數(shù)組來獲得類似的結(jié)果,如以下示例所示。
<?php
//定義函數(shù)
function divideNumbers($dividend, $divisor){
$quotient = $dividend / $divisor;
$array = array($dividend, $divisor, $quotient);
return $array;
}
//將變量作為數(shù)組進(jìn)行賦值
list($dividend, $divisor, $quotient) = divideNumbers(10, 2);
echo $dividend; // 輸出: 10
echo $divisor; // 輸出: 2
echo $quotient; // 輸出: 5
?>測試看看?/?在PHP中,有兩種方式可以將參數(shù)傳遞給函數(shù):按值傳遞和通過引用傳遞。 默認(rèn)情況下,函數(shù)參數(shù)按值傳遞,因此如果函數(shù)內(nèi)的參數(shù)值發(fā)生更改,它不會(huì)受到函數(shù)外部的影響。 但是,要允許函數(shù)修改其參數(shù),它們必須通過引用傳遞。
通過引用傳遞參數(shù)的方法是在函數(shù)定義中的參數(shù)名稱前加上與號(hào)(&),如下例所示:
<?php
/* 定義一個(gè)與數(shù)字相乘的函數(shù)
并返回新值 */
function selfMultiply(&$number){
$number *= $number;
return $number;
}
$mynum = 5;
echo $mynum; // 輸出: 5
selfMultiply($mynum);
echo $mynum; // 輸出: 25
?>測試看看?/?您可以在PHP腳本中的任何位置聲明變量。 但是,聲明的位置決定了變量在PHP程序中的可見性范圍,即變量可以在哪里使用或訪問。 這種可訪問性稱為變量作用域。
默認(rèn)情況下,在函數(shù)內(nèi)聲明的變量是局部變量,不能從該函數(shù)外部訪問或操作它們,如以下示例所示:
<?php
//定義函數(shù)
function test(){
$greet = "Hello World!";
echo $greet;
}
test(); // 輸出: Hello World!
echo $greet; //產(chǎn)生未定義的變量錯(cuò)誤
?>測試看看?/?同樣,如果嘗試訪問或?qū)牒瘮?shù)內(nèi)部的外部變量,則會(huì)得到未定義的變量錯(cuò)誤,如以下示例所示:
<?php
$greet = "Hello World!";
//定義函數(shù)
function test(){
echo $greet;
}
test(); //生成未定義變量錯(cuò)誤
echo $greet; // 輸出: Hello World!
?>測試看看?/?從上面的示例中可以看到,無法從外部訪問在函數(shù)內(nèi)部聲明的變量,同樣,不能在函數(shù)內(nèi)部訪問在函數(shù)外部聲明的變量。這種分離減少了函數(shù)內(nèi)變量受主程序中變量影響的機(jī)會(huì)。
提示:可以在不同的函數(shù)中為變量使用相同的名稱,因?yàn)榫植孔兞恐荒苡陕暶魉鼈兊暮瘮?shù)識(shí)別。
在某些情況下,您需要將主程序中的變量導(dǎo)入函數(shù)中,反之亦然。 在這種情況下,可以在函數(shù)內(nèi)部的變量之前使用global關(guān)鍵字。 此關(guān)鍵字將變量轉(zhuǎn)換為全局變量,使其在函數(shù)內(nèi)部和外部均可見或可訪問,如以下示例所示:
<?php
$greet = "Hello World!";
//定義函數(shù)
function test(){
global $greet;
echo $greet;
}
test(); // 輸出: Hello World!
echo $greet; // 輸出: Hello World!
//將新值賦給變量
$greet = "Goodbye";
test(); // 輸出: Goodbye
echo $greet; // 輸出: Goodbye
?>測試看看?/?您將在PHP類和對(duì)象一章中了解有關(guān)可見性和訪問控制的更多信息。
遞歸函數(shù)是一次又一次調(diào)用自身直到滿足條件的函數(shù)。遞歸函數(shù)通常用于求解復(fù)雜的數(shù)學(xué)計(jì)算或處理深度嵌套的結(jié)構(gòu),例如,打印深度嵌套數(shù)組的所有元素。
以下示例演示了遞歸函數(shù)的工作方式。
<?php
//定義遞歸函數(shù)
function printValues($arr) {
global $count;
global $items;
//檢查$arr是否為數(shù)組
if(!is_array($arr)){
die("ERROR: Input is not an array");
}
/*
遍歷數(shù)組,如果value本身是數(shù)組,則遞歸調(diào)用
函數(shù)將找到的值添加到輸出項(xiàng)目數(shù)組中,
并為找到的每個(gè)值將計(jì)數(shù)器加1
*/
foreach($arr as $a){
if(is_array($a)){
printValues($a);
} else{
$items[] = $a;
$count++;
}
}
//返回?cái)?shù)組中的總計(jì)數(shù)和值
return array('total' => $count, 'values' => $items);
}
//定義嵌套數(shù)組
$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"
)
)
);
//計(jì)算和打印嵌套數(shù)組中的值
$result = printValues($species);
echo $result['total'] . ' value(s) found: ';
echo implode(', ', $result['values']);
?>測試看看?/?注意:創(chuàng)建遞歸函數(shù)時(shí)要小心,因?yàn)槿绻a編寫不正確,可能會(huì)導(dǎo)致函數(shù)調(diào)用的無限循環(huán)。