轉載來自:https://www.cnblogs.com/liuyongqi/p/6942996.html
【函數聲明和使用】
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>";
}
未完,待續。。。