函數(shù)是可以在程序中重復使用的語句塊刁绒,在頁面加載時函數(shù)不會立即執(zhí)行客年,只有在被調用時才會執(zhí)行蛾找。
//無返回值
function (par1,par2,par3...){
code;
}
//有返回值
function (par1,par2,par3...){
return result;
}
在代碼執(zhí)行過程中娩脾,如果遇到函數(shù)則會進入函數(shù)作用域,直到遇到 return
或執(zhí)行完畢后打毛,回到外層函數(shù)名的位置柿赊,繼續(xù)執(zhí)行后面的代碼。
- 參數(shù)
- 形參
1. 形參一定是變量名幻枉;
function dosomething($par1,$par2){} // √
function dosomething($par1,par2){} // ×
2. 只在當前函數(shù)中有效碰声;
<?php
function dosomething($par1){
echo $par1; // √
}
dosomething('11'); // 11
echo $par1; // ×
3. 設置默認參數(shù);
function dosomething($a,$b=2){ //$b=2 為默認參數(shù)設置
$result=$a*$b;
return $result;
}
echo dosomething(2,4); //8
$box1=dosomething(199); //398
echo $box1;
▁ 參數(shù)默認值不能為對象熬甫、資源類型胰挑;
▁ 在低版本中,參數(shù)不能直接傳遞變量,需要使用 & 符號瞻颂;
- 實參
1. 實參可以是標量脚粟、變量;
2. 實參跟形參應一一對應蘸朋; - 參數(shù)數(shù)量
1. 實參多于形參時不會報錯(多數(shù)語言會報錯)核无;
2. 實參少于形參,并且沒有或默認參數(shù)不夠的情況下會報錯藕坯;
3. 實參少于形參团南,但是默認參數(shù)可以對應的情況下不會報錯; - 未定參數(shù)
◇ func_get_agrs():獲取函數(shù)內所有的實參炼彪,返回一個數(shù)組吐根;
◇ func_get_agr(n):獲取第 n 個參數(shù),n 的起始下標 0辐马;
◇ func_num_agrs():獲取所有實參的長度拷橘;
<?php
function sum(){
$result=0;
foreach(func_get_args() as $i){
$result+=$i;
}
echo func_num_args()." , ";
return $result;
}
echo sum(1,23,4,32,4,2); //6, 66
echo '<hr/>';
echo sum(1,2); //2, 3
echo '<hr/>';
echo sum(123,1); //2, 124
- 特殊函數(shù)
- 可變函數(shù):如果一個變量名后面有括號,PHP 將尋找與該變量值同名的函數(shù)喜爷,并且嘗試執(zhí)冗疮。"可變函數(shù)" 還可以用來實現(xiàn)包括回調函數(shù)、函數(shù)表在內的一些用途檩帐。
<?php
function func1($a,$b){
return $a*$b;
}
$fc="func1";
echo $fc(2,4);
- 匿名函數(shù):匿名函數(shù)也叫閉包函數(shù)术幔,允許臨時創(chuàng)建一個沒有指定名稱的函數(shù)。
最經(jīng)常用作回調函數(shù) callback 參數(shù)的值湃密。
◇ 賦值形式:
<?php
$greet=function($name){
printf("Hello %s",$name);
};
$greet('World'); //hello world
$greet('PHP'); //hello PHP
◇ 參數(shù)形式:
<?php
$arrs=[1,2,3,1,5,1,51,121];
$fn=call_user_func_array(function(){
$a=func_get_args();
$sum=0;
foreach ($a as $i){
$sum+=$i;
}
return $sum;
},$arrs);
echo $fn; //185
- printf() 函數(shù)诅挑、及其他相關函數(shù)可 參考。
作用域
局部作用域 | 全局作用域 | 超全局作用域 | 靜態(tài)局部作用域 |
- 作用域中的變量
/* 各自獨立 */
<?php
$overall=100;
function dosomething(){
$locals=998;
echo $overall; //Undefined
}
dosomething();
echo $locals; //Undefined
————————————————————————————————————————
/* 互不影響 */
<?php
$thisOne=100;
function dosomething(){
$thisOne=1;
echo $thisOne; //1
}
dosomething();
echo $thisOne; //100
- 訪問全局變量
- 使用
global
關鍵字:
<?php
$thisOne=100;
function dosomething(){
global $thisOne;
$thisOne++;
echo $thisOne; //100
}
dosomething();
echo $thisOne //101
- 使用
$GLOBALS
全局數(shù)組:
<?php
$thisOne=100;
function dosomething(){
echo $GLOBALS['thisOne']; //100
$GLOBALS['thisOne']++;
echo "<hr/>".$GLOBALS['thisOne']; //101
}
dosomething();
echo "<hr/>$thisOne"; //101
◇ 通過 $GLOBALS
數(shù)組創(chuàng)建全局變量:
<?php
$thisOne=100;
function dosomething(){
echo $GLOBALS['thisOne'];
$GLOBALS['thisTwo']=200;
echo $thisTwo; //Undefined 不能直接訪問
echo $GLOBALS['thisTwo']; //在局部中只能通過數(shù)組鍵名訪問
}
dosomething();
echo "<hr/>$thisTwo"; //200 成功
◇ 通過 global
創(chuàng)建全局變量:
<?php
function dosomething(){
global $some;
$some=9;
echo $some; //9
}
dosomething();
echo $some; //9
- 檢測函數(shù)是否被定義:
function_exists()
<?php
function testfunc(){
echo '已定義';
}
if(function_exists('testfunc')){ //true
testfunc();
}
函數(shù)的編程思想
- 遞歸思想
要解決一個復雜的問題泛源,根據(jù)現(xiàn)實邏輯拔妥,可以通過多個子類問題的答案解決,而這些子類問題又可以通過多個小問題解決达箍,以此類推...一直到最小的問題没龙,通常都會是一個已知的數(shù)據(jù)。
<?php
function demo(){
static $i=1;
echo "$i,";
$i++;
if($i<10){
demo(); //簡單講:遞歸就是在調用自己
}
}
demo(); //1,2,3,4,5,6,7,8,9幻梯,
- 階乘案例
//求未知數(shù)的階乘
<?php
function factorial($n){
if($n==1){
return 1;
}
$result=factorial($n-1)*$n;
return $result;
}
echo factorial(3); //6
- 遞推思想(迭代思想)
要解決一個復雜的問題兜畸,如果能得知最小問題的答案(通常是已知),根據(jù)算法得出上級問題的答案碘梢,以此類推一直推算到可以解決復雜問題咬摇。 -
遞推圖例
- 斐波那契數(shù)列
<?php
function fibonacci($n){
$n1=1; //數(shù)列的第一個初始數(shù),代表求值的上兩個數(shù)
$n2=1; //數(shù)列的第一個初始數(shù)煞躬,代表求值的上一個數(shù)
$result=0;
for($i=3;$i<=$n;$i++){
$result=$n1+$n2;
$n1=$n2; //數(shù)據(jù)輪換
$n2=$result; //數(shù)據(jù)輪換
}
return $result;
}
echo fibonacci(3); //第3項的結果為:2
echo fibonacci(4); //第4項的結果為:3
echo fibonacci(5); //第5項的結果為:5
echo fibonacci(6); //第6項的結果為:8
▁ 遞歸推算規(guī)則:從大到小肛鹏,再回歸到大逸邦;
▁ 遞推推算規(guī)則:從小到大;
▁ 在兩種方法都能解決問題時在扰,優(yōu)先使用遞推解決缕减;