在本教程中,您將學(xué)習(xí)如何在PHP中創(chuàng)建自己的自定義函數(shù)。
函數(shù)是執(zhí)行特定任務(wù)的獨(dú)立代碼塊。
PHP有一個巨大的集合內(nèi)置函數(shù),你可以在你的PHP腳本中直接調(diào)用執(zhí)行特定的任務(wù),如:gettype(),print_r(),var_dump等。
請查看PHP參考部分,以獲得有用的PHP內(nèi)置函數(shù)的完整列表。
除了內(nèi)置函數(shù),PHP還允許您定義自己的函數(shù)。這是創(chuàng)建執(zhí)行特定任務(wù)的可重用代碼包的一種方法,并且可以與主程序分開保存和維護(hù)。以下是使用函數(shù)的一些優(yōu)點(diǎn):
函數(shù)減少了程序中代碼的重復(fù) - 函數(shù)允許您將常用的代碼塊提取到單個組件中?,F(xiàn)在,您可以通過在腳本中的任何位置調(diào)用此函數(shù)來執(zhí)行相同的任務(wù),而不必反復(fù)復(fù)制和粘貼相同的代碼塊。
函數(shù)使代碼的維護(hù)更加容易 - 由于一次創(chuàng)建函數(shù)可以多次使用,因此在函數(shù)內(nèi)部進(jìn)行的任何更改都會在所有位置自動實(shí)現(xiàn),而無需修改多個文件。
通過函數(shù)可以更輕松地消除錯誤 - 將程序細(xì)分為函數(shù)時,如果發(fā)生任何錯誤,您將確切知道是哪個函數(shù)導(dǎo)致了錯誤以及在哪里可以找到它。因此,修復(fù)錯誤變得容易得多。
可以在其他應(yīng)用程序中重用功能 - 由于函數(shù)與腳本的其余部分是分開的,因此僅通過包含包含這些函數(shù)的php文件,就可以在其他應(yīng)用程序中輕松重復(fù)使用相同的功能。
下一節(jié)將向您展示如何輕松地在PHP中定義自己的函數(shù)。
創(chuàng)建自定義函數(shù)的基本語法可以給出:
function functionName(){ //要執(zhí)行的代碼 }
用戶定義函數(shù)的聲明以單詞function開頭,后跟要創(chuàng)建的函數(shù)的名稱,再后跟括號,即(),最后將函數(shù)的代碼放在大括號之間{ }。
這是一個用戶定義函數(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ù)中的占位符變量;它們在運(yùn)行時被調(diào)用時提供給函數(shù)的值(稱為參數(shù))替換。
function myFunc($oneParameter,$anotherParameter){ //要執(zhí)行的代碼 }
您可以根據(jù)需要定義任意多個參數(shù)。 但是,對于您指定的每個參數(shù),在調(diào)用函數(shù)時需要將相應(yīng)的參數(shù)傳遞給該函數(shù)。
以下示例中的getSum()函數(shù)將兩個整數(shù)值作為參數(shù),只需將它們加在一起,然后在瀏覽器中顯示結(jié)果。
<?php //定義函數(shù) function getSum($num1, $num2){ $sum = $num1 + $num2; echo "兩個數(shù)字$num1和$num2的和是 : $sum"; } //調(diào)用函數(shù) getSum(10, 20); ?>測試看看?/?
上面代碼的輸出將是:
兩個數(shù)字10和20的和是 : 30
提示:參數(shù)是您傳遞給函數(shù)的值,參數(shù)是函數(shù)中接收參數(shù)的變量。但是,在通常用法中,這些術(shù)語是可以互換的,即參數(shù)是自變量。
您也可以創(chuàng)建帶有可選參數(shù)的函數(shù) - 只需插入?yún)?shù)名稱,后跟等號(=),然后是默認(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"); ?>測試看看?/?
正如您可以看到的,對 customFont ()的第三個調(diào)用不包括第二個參數(shù)。這將導(dǎo)致 PHP 引擎使用 $size 參數(shù)的默認(rèn)值,即1.5。
函數(shù)可以使用return語句將值返回給調(diào)用該函數(shù)的腳本。該值可以是任何類型,包括數(shù)組和對象。
<?php //定義函數(shù) function getSum($num1, $num2){ $total = $num1 + $num2; return $total; } //打印返回值 echo getSum(5, 10); // 輸出: 15 ?>測試看看?/?
一個函數(shù)不能返回多個值。但是,您可以通過返回一個數(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ā)生更改,它不會受到函數(shù)外部的影響。 但是,要允許函數(shù)修改其參數(shù),它們必須通過引用傳遞。
通過引用傳遞參數(shù)的方法是在函數(shù)定義中的參數(shù)名稱前加上與號(&),如下例所示:
<?php /* 定義一個與數(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)生未定義的變量錯誤 ?>測試看看?/?
同樣,如果嘗試訪問或?qū)牒瘮?shù)內(nèi)部的外部變量,則會得到未定義的變量錯誤,如以下示例所示:
<?php $greet = "Hello World!"; //定義函數(shù) function test(){ echo $greet; } test(); //生成未定義變量錯誤 echo $greet; // 輸出: Hello World! ?>測試看看?/?
從上面的示例中可以看到,無法從外部訪問在函數(shù)內(nèi)部聲明的變量,同樣,不能在函數(shù)內(nèi)部訪問在函數(shù)外部聲明的變量。這種分離減少了函數(shù)內(nèi)變量受主程序中變量影響的機(jī)會。
提示:可以在不同的函數(shù)中為變量使用相同的名稱,因?yàn)榫植孔兞恐荒苡陕暶魉鼈兊暮瘮?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類和對象一章中了解有關(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ù)組中, 并為找到的每個值將計(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ù)時要小心,因?yàn)槿绻a編寫不正確,可能會導(dǎo)致函數(shù)調(diào)用的無限循環(huán)。