1. 程式人生 > >php函式,static,global關鍵字及三種變數作用域

php函式,static,global關鍵字及三種變數作用域

函式

和js函式類似,關注php與其他語言不用的地方

  • 函式的形參預設值

    形式:

    function f($a,$b=3,$vc = "abc"){
    
    }
    

    注意:沒有給預設值的形參必須傳遞值,

  • 形參的傳值問題

    一句話:形參的傳值問題,其實就是“變數之前的傳值問題”,即實參變數傳給形參變數,有值傳遞和引用傳遞

    引用傳遞(需要在形參前面加&符號而不是實參):

    function f($a,& $b){
    
    }
    
  • 函式引數的數量的問題

    1. 通常,形參和實參的數量是一致的;
    2. 當函式形參有預設值的時候,實參可以進行一定程度的省略(省略只能從右往左省略);
    3. 有一種定義和使用函式的特別形式(並不常見)它不定義形參,而實參任意給出,其實系統中也有類似的函式:比如: – 靈活性體現之一

      1. var_dump($v1);
      2. var_dump($v1,$v2,$v3);

      我們自己也可以定義這種函式,其實,這種函式,依賴的是以下三個系統函式來獲取相應的資訊,以得到實引數據的處理:

      1. func_get_args(); // 獲取實引數據列表,成為一個數組
      2. func_get_args(i);//i個實引數據,$i從0開始算起
      3. func_num_args(); // 獲取實參的數量(個數)

      如:

      // 系統函式func_get_args()可以獲取函式呼叫時傳遞過來的所有實引數據,並且都放入一個數組中!
      function f(){
          $arr = func_get_args();
      }

函式的返回值:函式的返回值不是語法規定,而是業務所需,需要就返回,不需要則無需返回,返回值一定是通過return 語句!

函式的其他形式:

  • 可變函式:一個變數的名字是一個變數 – > 靈活性體現
  • 可變變數:一個函式的名字是一個變數,其實就是在呼叫函式的時候,使用一個變數名而已,該變數的內部,就是該函式名! – > 靈活性體現

匿名函式

形式1:將一個匿名函式“賦值”給一個變數,然後通過該變數呼叫該函式

$f1 = function (){

};

使用:

$f1(); // 呼叫該匿名函式,和可變函式使用一樣的

形式2:直接將匿名函式作為另外一個函式的實參傳遞進去(因為形參對應的是一個函式)

如:

function f1($a,$b,$sum){
    echo "$a =".$a;
    echo "$b =".$b;
    $result = $sum($a,$b);
    echo "result = ".$result;
}
呼叫:
f1(21,2,function ($a,$b){
    returm $a + $b;
});

變數作用域

定義:變數可以使用的範圍

php中有三種作用域

  • 區域性作用域:在函式內部範圍,對應的變數為區域性變數
  • 全域性作用域:不在函式內部的範圍,–函式外部和程式碼塊中的定義的變數是全域性變數

  • 超全域性作用域:指所有的程式碼範圍,就稱為超全域性變數,其實只有系統預定義的幾個:$_GET,$POST,$_SERVER,$_SESSION,$_REQUEST,$GLOBALS,$_FILES,$_COOKIE..

通常:

  • 全域性範圍不能訪問區域性範圍;
  • 區域性範圍不能訪問全域性範圍;
  • 函式內部的變數(區域性變數),通常在函式呼叫執行結束後,就被“銷燬”了;
  • 有一種區域性變數,在函式呼叫結束後不會被“銷燬”,這種變數就是靜態區域性變數(用static修飾)。

區域性作用域使用(訪問)全域性變數?(常見需求)

php中不能像其他語言一樣直接在區域性作用域中訪問全域性變數,

做法1:而要使用global宣告一個要使用的全域性變數的同名區域性變數

     如:

        $v = 4;
        function f(){
            global $v; // 使用global宣告一個變數,該變數和全域性變數同名,並和全域性變數共同指向一個數據區,,相當於複製了引用
        }

做法2:通過$GLOBALS預定義變數訪問全域性變數,如

    $v = 1;
    function f(){
        echo "\$v = ".$GLOBALS['$v']; // 取得全域性變數$v的值
        $GLOBALS['$v'] = 55; // 改變全域性變數$v的值
        unset($GLOBALS['$v']); // 釋放$v變數,此時全域性變數$v就變成null了
    }

但,如果我們對$GLOBALS變數的某個單元(下標)進行unset,則其就會完全銷燬對應的全域性變數,這裡不是複製了引用

有關函式的系統函式:

  • function_exists(函式名) : 判斷一個函式是否存在
  • func_get_args();
  • func_get_args($index);
  • func_num_args()。