PHP(六)函數

當程序代碼多了之後,用函數來組織這些程序。PHP最初的設計原則是用函數來組織程序,以讓一段代碼造成一個」程序模塊「,無論在什麼地方使用這些函數時,便可調用函數,省去了重複編寫代碼的麻煩,也方便了代碼的審閱、修改和完善。
php

如何使用函數

函數相似於一個黑盒。放入須要的東西,返回給你結果。html

」函數名()「能夠調用函數。mysql

系統(內置)函數

PHP有不少標準的函數,這些函數分爲兩部分,一部分是核心函數,例如字符串和變量函數,在PHP安裝後,默認就有。還有一些函數須要和特定的PHP擴展模塊一塊兒安裝,不然在使用它們的時候就會獲得一個致命的」未定義函數「錯誤。例如,要使用圖像函數imagecreatetruecolor(),須要在安裝PHP的時候加上GD(一個圖像處理庫)的支持。或者,要是用MySQL數據庫的鏈接函數mysql_connect(),就要在安裝PHP的時候加上MySQL數據庫的支持。要知道當前你是用的PHP有哪些函數,能夠調用phpinfo()函數或者get_loaded_extensions()函數獲得PHP加載了哪些擴展庫。sql

對於默認就是有效的函數庫,PHP手冊中的函數參考章節按照不一樣的擴展庫組織了它們的文檔。數據庫

自定義函數

函數以關鍵字function開頭,而後是空格,緊接着是本函數的函數名稱,接着是一對括號,括號裏面是函數參數,括號後面是大括號,和其中的內容,叫函數體,即實現函數功能的代碼,大括號用來界定函數代碼的範圍,代表其內的代碼屬於此函數,最後一句能夠有return語句,這代表函數返回結果。
數組

在目前的PHP版本中,函數具備全局屬性,也就是說在定義一個函數以後,能夠在程序的任何地方使用,定義函數的位置能夠在程序的任何地方,甚至能夠放在另外一個函數的內部。函數

函數參數

函數的參數是用來和函數溝通的途徑,參數以逗號做爲分隔符。
ui

調用函數時,須要給參數傳值,傳值有3種方式:spa

  • 按值傳遞設計

  • 引用傳遞,把變量的值賦給參數,那個變量的值會隨參數的改變而改變,格式是在參數前加一個&

  • 默認值,在定義函數參數的時候就給它設定一個默認值,若是調用函數時沒有給參數,那麼便會使用它的默認值,若是給了,就會使用給定的參數值。默認值必須是常量表達式,不是變量、類成員,或者函數調用等。在函數參數使用默認值的時候,若是有多個參數,那麼須要將有默認值的參數放在任何非參數默認值的右邊,否則會報錯。

返回值

函數值經過使用可選的返回語句返回。一般使用return語句,任何類型均可以返回,其中包括列表和對象。若是return語句在函數中,那麼執行後將會當即中止該函數運行,並將控制權傳遞迴它被調用的行。函數不能返回多個值,可是能夠返回一個數組來獲得多個值。

一樣,函數也能夠返回一個調用,這和變量的引用相似,只須要在函數前加一個&,下面舉一個例子:

<?php
    function &returnReference(){
         $someReference = "you are hansome";
        return $someReference;
    }
    
    $reference = &returnReference();
    echo $reference;
?>

變量$reference是函數returnReference返回的一個引用。

動態調用函數

栗子:

普通作法:

<?php
//設置字符串轉換方式:小寫(strtolower),大寫(strtoupper)
$functionName = 'strtolower'; 
$string = "ABC";  //設置要處理的字符串

//判斷用戶設置
if($functionName == 'strtolower'){
   //調用函數處理
   $string = strtolower($string);
}
?>

另外一種作法,動態調用函數

<?php
//設置字符串轉換方式:小寫(strtolower),大寫(strtoupper)
$functionName = 'strtolower'; 
$string = "ABC";  //設置要處理的字符串

$functionName($string);
?>

上面的就是PHP中的動態調用函數,注意第六行,變量後面有圓括號,這意味着PHP將尋找與變量$functionName的值同名的函數,而且將嘗試執行它,結果爲處理$string的函數是strtolower,若是設置爲strtoupper,那麼處理$string的函數是strtoupper。

動態調用函數不能用於語言結構,例如echo()、print()、unset()、isset()、empty()、include()、require()及相似的語句,除非將這些語言結構從新用自定義函數包裝起來,而後使用包裝的函數調用。

做用域

下面要說的是變量和函數在文件結構中的做用域以及一些改變其做用域的方法。

局部做用域

局部做用域即只是在某一個區間內有效。

函數內定義的變量沒法直接在函數外使用。

函數外定義的變量沒法直接在函數內使用。

函數內要使用函數外定義的變量,需在變量前加上關鍵字global,後面是空格變量,這樣函數內姐可使用函數外的變量了,若是有多個變量的話,就要使用逗號隔開。

還有一種方法是使用超全局變量來訪問具備全局做用的變量,可是一般狀況下不這樣作。(我如今還不懂這個)

全局做用域

在前面提到過,函數具備全局做用域,也就是定義一個函數,那麼該函數能夠在程序的任何地方使用。在PHP中,雖然直接在文件開頭定義的變量是全局變量,可是在函數中卻須要加關鍵字global纔可使用,但若是有必要能夠將變量定義在預約義變量中,由於PHP預約義變量是超全局變量,超全局變量在PHP中任何地方均可以使用,這個特性和函數的特性同樣。

舉一個例子:

<?php
//定義變量$test
$test = 'abcd';

//定義函數printVar
function printVar(){
   echo '在函數printVar內顯示的$GLOBALS[\'test\']:'.$GLOBALS['test'];
   echo "<br>";
}

printVar();
echo '直接顯示的$GLOBALS[\'test\']:'.$GLOBALS['test'];
echo "<br>";
echo '直接顯示的$test:'.$test;
?>

效果:

在函數printVar內顯示的$GLOBALS['test']:abcd
直接顯示的$GLOBALS['test']:abcd
直接顯示的$test:abcd

再舉一個例子:

<?php
//定義變量$test
$test = 'abcd';

//定義函數printVar
function printVar(){
    $wahaha = 'wahaha';
}


echo '直接顯示的$GLOBALS[\'test\']:'.$GLOBALS['test'];
echo "<br>";
echo '直接顯示的$GLOBALS[\'wahaha\']:'.$GLOBALS['wahaha'];
?>

運行以後會發現提示「Notice:Undefined index:wahaha in ....」,意思是未定義的索引「wahaha」,「$GLOBALS['wahaha']:」後面沒有顯示結果。

$test變量沒有在任何函數內或者foreach等結構內,因此具備全局屬性,這些變量均可以用超全局變量$GLOBAL訪問,反之,在函數printVar內定義的變量$wahaha則具備局部屬性,只是在函數printVar中才有效,因此不能用$GLOBAL訪問

生存期

變量和函數放在不一樣的地方會有不同的生存期,變量生存期的內容與函數及結構息息相關。

舉一個栗子:

<?php
   
   function test(){
       $a = 0;
       echo $a;
       $a++;
   }
   
   test();
   test();
?>

結果是:

00

函數內的$a是一個局部做用域變量,每次調用函數都會將變量$a的值設爲0並輸出0,將變量自加1的$a++沒有做用,由於一旦退出本函數變量$a就不存在了。

那麼要將函數內的變量$a保留下來,除了return返回值以外,還可使用靜態變量,在$a前面加上關鍵字static,以後變量$a的生存期就被改變,不由於調用的結束而結束,當第二次調用該函數時,變量$a的值依舊存在。

函數生存期的例子:不推薦在函數中定義函數,一旦這樣的話,上層函數就只能調用一次,由於不能重複定義函數中的那個函數。

相關文章
相關標籤/搜索