【PHP】最詳細PHP從入門到精通(二)——PHP中的函數

轉載來自: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>";
}

未完,待續。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章