PHP從入門到精通
之PHP中的函數
各位開發者朋友大家好,自上次更新PHP的相關知識,得到了大家的廣泛支持。PHP的火爆程度不言而喻,函數作為PHP中極為重要的部分,應諸位的支持,博主繼續跟進更新PHP中的函數知識,為大家帶來最詳細實用的知識講解,感謝大家的支持!
以下為函數的詳細知識:
函數的聲明和使用 |
1、函數名是標識符之一,只能有字母數字下划線,開頭不能是數字。
函數名的命名,須符合"小駝峰法則" myName my_name
函數名不區分大小寫func(),FUNC()
函數名不能與已有函數名重復,不能與系統函數名重復;
2、function_exists("fun1");用於檢測函數是否已聲明;
注意:傳入函數名,必須是字符串格式;返回結果為true/false;
簡單函數的聲明和調用:
function func1(){ echo "函數里面的語句"; } func1(); FUNC1();
PHP中函數的作用域 |
1、局部變量:聲明在函數內部的變量,稱為局部變量。只在函數內部能用,函數外如需使用,需在函數中用return關鍵字返回;
2、全局變量:聲明在函數外部的變量,稱為全局變量。
<函數中使用全局變量的3種方式:>
3、函數中,使用變量,默認使用全局變量。只在函數外部能用,函數內如需使用,需在函數中用global關鍵字將變量改為全局變量引入;函數中的變量名如果與全局變量重復,global語句之上的為函數局部變量,global之下的為系統全局變量;
4、$GLOBALS[""]全局數組:
$GLOBALS[""]數組,是PHP給我們內置的全局數組,可以直接給數組添加值,無論在函數內外聲明,均可在任何地方直接使用;
5、函數中使用全局變量還有一種方式,:通過給函數傳參,可以在函數內部使用過全局變量;
但是,傳遞以后的參數是函數的局部變量,內部改變,外部不會變;
除非,傳遞的參數是地址function func($a1,&$a2){}//函數內部修改a1,全局a1不變;函數內修改a2,全局a2跟着變;
如果,函數的形參,出現了取址符號,則,調用函數時,實參必須是變量,而不能是自變量:
eg上式中:func(1,2)× func(1,$a2)√
6、使用require和include包含,不會影響作用域;
實例展示:
$a1=10; function func(){ $a1=30; echo "0.$a1</br>";//global之上使用局部變量 $GLOBALS["a3"]=40; echo $GLOBALS["a3"]."</br>";//global數組 global $a1; $a2=20; echo "1.$a1</br>";//global之下使用全局變量 echo "1.$a2</br>"; return $a2."</br>"; } $a2=func(); echo "2.{$a1}</br>";//使用全局變量 echo "2.{$a2}</br>";//通過return返回,通過變量接受 echo $GLOBALS["a3"]."</br>";//函數中通過$GLOBALS["a3"]聲明,函數外能用。
靜態變量 |
1、靜態變量使用static關鍵字聲明。
static $num=0;
2、靜態變量的特點:
>>>靜態變量在函數第一次加載的時候進行聲明。
>>>函數使用完不會立即釋放變量,靜態變量在整個腳本過程中,只會聲明一次。
>>>同一函數,多次調用,共享一個靜態變量。
實例展示:
function func(){ static $num=0; $num++; echo $num."</br>"; } func(); func(); func();
函數的參數傳遞 |
此處插入一條,需特別注意:在PHP中,設計參數傳遞時,實參列表只能比形參多,不能比實參少!
1、常規參數傳遞:
2、偽類型參數傳遞:(詳見案例)
①通過&引用參數傳遞,函數內修改變量,函數外同步變化;
②形參為引用參數,實參只能是變量,不能是字面量:func(10)×
3、默認參數的調用:function func($a=10,$b){} func(,20);//$a可以不傳參數,默認是10;$b必須傳參數
>>>如果參數中既有默認參數,又有非默認參數,那么,默認參數列表必須要在非默認參數列表的后面!即調用的時候,必須保證非默認參數的優先賦值。
4、可變參數列表傳遞:由於PHP實參可以比形參多,那么我們可以傳遞N個實參,並通過PHP內置函數取到對應參數。
func_get_args()//取所有參數列表(數組)
func_num_args()//返回參數的總個數,相當於count($arr);
func_get_arg(0)//根據下標,取每個參數;相當於$arr[0];
實例展示:
function($a){ $a+=10; return $a; } echo func(10); //引用類型的參數傳遞 $a=10; functionfunc(&$a){ $a+=10; } func($a);//通過取址符號,可以直接將傳入的$a的值改掉。 echo $a; //默認參數 function func($b,$a=10){ return $a+$b; } echo func(20); //可變參數列表 function func(){ $arr=func_get_args(); var_dump(func_get_args());//取所有參數列表(數組) var_dump(func_num_args());//返回參數的總個數 //var_dump(count($arr));//同上 var_dump(func_get_arg(0));//根據下標,取每個參數 //var_dump($arr[0]);//同上 $sum=0; $count=func_num_args(); for($i=0;$i<$count;$i++){ //$sum+=func_get_arg($i); $sum+=$arr[$i]; } return $sum; } echo func(1,2,3,4,5);
回調函數 |
1、使用變量函數,自定義回調函數:
function($func){$func();} --> function f(){} ---> func("f")
2、使用call_user_func_array和call_user_func自定義回調函數:
兩個函數的第一個參數,均為回調函數,表示執行當前回調;
不同點在於:前者的第二個參數為數組,並將數組的每個值賦給回調函數的參數列表
后者的參數列表直接展開寫到第2~多個參數中
實例展示:
//變量函數 function func($a){ echo "Q的前端{$a}"; } $fun="func"; $fun(10); //自定義回調函數 function func($start,$end,$fun){ //$fun="func"; //$fun(); for($i=$start;$i<=$end;$i++){ if($fun($i)){ echo "{$i}</br>"; } } } function filter($num){ if($num%3!=0){ return true; }else{ return false; } } func(1,59,"filter"); //使用call_user_func_array和call_user_func自定義回調函數 function func(){ $arr = func_get_args() ; $str = ""; for($i=0;$i<count($arr);$i++){ $str = $arr[$i]; } return $str; } //相當於apply echo call_user_func_array("func", array("傑瑞","教育","HTML5","+","PHP")); //相當於執行func函數,並且把數組的每一項作為參數傳入 echo "<br>"; //相當於call echo call_user_func("func","傑瑞","教育","HTML5","+","PHP");
匿名函數 |
由於變量函數在調用時存在多種調用方式(func()/$fun())
所以為了讓函數的調用更加統一,才產生了匿名函數。
!!!聲明匿名函數,函數體后面的分號必不可少!!!
匿名函數本身也是變量,用var_dump()檢測,為Object類型;
實例展示:
function func(){} func(); $fun="func"; $fun(); $func=function($a){ echo "這是匿名函數{$a}"; }; $func(10);//可以傳參
遞歸函數 |
1、所謂遞歸,指的是在函數內部執行自身的操作;
2、遞歸分為兩步:遞(類似JS事件捕獲) 歸(類似JS事件冒泡);
遞:當最外層函數體中,遇到自身函數調用,繼續進行內層函數執行。而外層函數的后半部分暫不執行。直到最內層函數執行完后,再逐步向外執行。
實例展示:
function func($num){ echo $num."</br>"; if(){ func($num-1); } echo $num."</br>"; } func(10);
附圖說明:
include&require |
1、兩者的作用,都是引入外部的PHP文件到當前文件夾中;
2、兩者的區別:當引入文件錯誤時,include會產生警告,並不影響后續代碼執行;而require會產生致命錯誤,后續代碼全部不再執行;
3、一般,當用於在文件最上方導入某些文件時,使用require導入,如果導入失敗,則不執行文件;
而如果是在某些分支條件中,導入某些操作,使用include導入,即使導入失敗,不影響后續代碼執行;
4、include_once和require_once表示:文件只能導入一次。如果多次調用函數,則后面的語句會判斷文件是否導入,再決定是否導入新文件(效率優化問題,不推薦)
!!!注意:檢測文件時,只關心文件是否導入,並不關心是以何種方式導入的;
5、include和require可以導入各種類型的文件,相當於在當前文件copy了一份,但是在copy過程中,PHP引擎會進行適當的編譯,確保不出現不必要的錯誤。
6、include和require是函數,也是指令。PHP對很多常用函數,會提供指令的寫法。
eg:函數寫法:echo("11"); 指令寫法:echo "11";
實例展示:
include ("funcText.php"); //require ("funcText.php");//接相對路徑 func1(); func2(); func3();
以下為funcText.php文件中的代碼:
<?php header ("Content-Type:text/html; charset=utf-8"); function func1(){ echo "我是func1</br>"; } function func2(){ echo "我是func2</br>"; } function func3(){ echo "我是func3</br>"; }
本期分享就到這里,覺得內容不錯的小伙伴請點推薦,歡迎大家在評論下方評論區與博主互動,謝謝大家!
未完,待續。。。
更多詳細內容,敬請關注 Q的前端世界的技術博客。