08-PHP函數的應用


函數定義

函數是一段完成指定任務的以命名代碼塊。 函數可以遵照給它的一組值或參數完成特定的任務,並且可能返回一個值。在php中有兩種函數:自定義函數和系統函數

函數的優越性

  • 控制程序設計的複雜性
  • 提高軟件的可靠性
  • 提高軟件的開發效率
  • 提高軟件的可維護性
  • 提高程序的重用性

判斷函數是否存在

function_exists():判斷函數是否存在

自定義函數

定義

自定義函數語法格式:

function 函數名稱([參數1[,參數2[,...]]]){
    程序內容敘述(函數體);
    [return 返回值;]//如需函數有返回值時使用
}
//return也有終止函數運行的意思

函數的使用:

函數名稱([參數1[,參數2[,...]]]);

自定義函數的名稱

它是函數在程序代碼中的識別名稱,函數名可以是以字母或下劃線開頭後跟零個或多個字母、下劃線和數字的任何字符串。函數名不區分大小寫,命名函數時不可使用已聲明的函數,或php內建的函數名稱。

參數

所謂的參數就是用來把數值由函數外部傳入函數體中,並用來加以運算處理。參數之間用","號隔開。當函數不需要任何數值傳入時,可以省略參數。

返回值

當調用函數時需要它返回一些數值,那麼就要函數體中用return
語句實現。return 返回值;

變量

局部變量
函數內部聲明的變量,只能在函數內部調用,這就是------++局部變量++
函數的參數就是一個局部變量,聲明是形成的,可以在調用時,給值,傳值

全局變量
全局變量,在函數外部聲明的變量,可以在每個函數中使用(順序)。
在函數內部如果需要使用函數外部的變量,需要使用global關鍵字,將外部變量引入

<?php
$name="姓名";
function text(){
    global $name;
    echo $name;
}
text();
?>
輸出:姓名

靜態變量
一個靜態變量在所有對該函數的調用之間共享,並且僅在腳本的執行期間函數第一次被調用時被初始化。要聲明函數變量爲靜態的用關鍵字static。 通常,靜態變量的第一次使用時賦予一個初始值

<?php
function test(){
    static $a=0;
    echo $a;
    $a++;
}
test();
test();
test();
test();
test();
?>
輸出:01234

常規參數的函數

  • 常規函數格式說明:String example(string name,int age, double height)
  • 常規參數的函數,就是實參和形參應該個數相等、類型一致。
  • 上面函數有三個參數,調用時傳遞的參數個數和順序必須一致

僞類型參數

  • 僞類型參數的函數格式說明:mixed funName(mixed $a,number $b,callback $c)
  • 三種僞類型:mixed(任意類型)、number、callback(函數類型)

引用參數的函數

  • 引用參數的函數格式說明:void funName(array &args)
  • 當該數值在函數中有任何變動時,會連帶隊父程序造成影響
  • 注意:如果在函數的形參中使用"&"修飾的參數,在調用函數時必須傳入一個變量給這個參數,不能傳遞一個值。
<?php
$a=0;
function age(&$a){
    $a+=100;
    echo $a;
}
age($a);
echo $a;
?>
輸出:100100

默認參數的函數

  • 默認參數的函數格式說明:mixed funName(string name[,string value [,int num]])
  • 在php中,支持函數的默認方式調用,如果在調用函數時沒有知道參數的值,在函數中會使用參數的默認值
  • 注意:默認參數必須列在所有沒有默認值參數的後面。
<?php
function test($a,$b=1,$c=2){
    echo $a+$b+$c;
}
test(10);
?>
輸出:13

可變個數參數的函數

  • 可變個數參數的函數格式說明:mixed funName(string arg1[,string ...])
  • 通常用戶定義函數時,設置的參數數量是有限的。如果希望函數可以接受任意數量的參數,需使用一下函數:
    • func_get_args()//返回一個數組,包含所有參數
    • func_num_args()//返回參數總數
    • func_get_arg()//接收一個數字參數,返回指定參數

變量函數

如果將一個函數名稱,給一個變量,然後再這個變量後面加上括號,就會調用這個變量值對應函數

例子:

<?php
function add($a,$b){
    return $a+$b;
}
function subtract($a,$b){
    return $a-$b;
}
function multiply($a,$b){
    return $a*$b;
}
function divide($a,$b){
    return $a/$b;
}

$ari=1;
$ar;
switch ($ari) {
	case 1:
		$ar="add";
		break;
	case 2:
		$ar="subtract";
		break;
	case 3:
		$ar="multiply";
		break;
	case 4:
		$ar="divide";
		break;
}

echo $ar(12,16);
?>
輸出:28

回調函數

  • 回調函數格式說明:mixed funName(callback arg)
  • 回調函數就是指調用函數時並不是傳遞一個標準的變量作爲參數,而是將另一個函數作爲參數傳遞到調用的函數中
    1. 變量函數
    2. 使用變量函數聲明和應用的回調函數
    3. 藉助call_user_func_array()函數自定義回調函數
    4. 類靜態函數和對象的方法回調
<?php
$arr=array("abc","a","aaaa","abcde","aaaaaaaaa");
function mysort($a,$b){
    if(strlen($a)>strlen($b))
        return 1;
    else if(strlen($a)<strlen($b))
        return -1;
    else return 0;
}
print_r($arr);
usort($arr,"mysort");
echo "</br>";
print_r($arr);
?>
輸出:
Array ( [0] => abc [1] => a [2] => aaaa [3] => abcde [4] => aaaaaaaaa ) 
Array ( [0] => a [1] => abc [2] => aaaa [3] => abcde [4] => aaaaaaaaa )

製作回調函數

  1. 使用變量函數聲明和應用回調函數
<?php
function demo($num,$n){
    for($i=0;$i<$num;$i++){
        if($n($i))
            continue;
        echo $i."</br>";
    }
}
//過濾所有的迴文數
function test($i){
    //strrev:翻轉字符串
    if($i==strrev($i))
            return true;
    else return false;
}

demo(500,"test");
  1. 藉助call_user_func_array()函數調用函數
<?php
function demo($num,$n){
    for($i=0;$i<$num;$i++){
        if(call_user_func_array($n,array($i))
            continue;
        echo $i."</br>";
    }
}
//過濾所有的迴文數
function test($i){
    //strrev:翻轉字符串
    if($i==strrev($i))
            return true;
    else return false;
}

demo(500,"test");
  1. 類靜態函數和對象的方法回調
<?php
class Filter{
    function one($i){
        if($i%3==0)
            return true;
        else
            return false;
    }
    
    static function two($i){
        if(preg_match('/3/',$i){
            return true;
        }else{
            return false;
        }
    }
}
function demo($num,$n){
    for($i=0;$i<$num;$i++){
        if(call_user_func_array($n,array($i))
            continue;
        echo $i."</br>";
    }
}
demo(500,array(new Filter(),"one"));//類中方法的回調
demo(500,array("Filter","two"));//類中靜態方法的回調
?>

系統函數

例如:遍歷一層目錄

$dirname="./phpmyadmin";
function fordir($dirname){
    //打開目錄資源
    $dir=opendir($dirname);
    
    readdir($dir);
    readdir($dir);
    while($file=readdir($dir)){
        $nfile=$dirname.'/'.$file;
        if(is_dir($nfile)
            echo "目錄:{$nfile}</br>";
        else 
            echo "文件:{$nfile}</br>";
    }
    closedir($dir);//關閉目錄資源
}
fordir($dirname);

遞歸函數

例子:遍歷文件夾下所有的文件,

$dirname="./phpmyadmin";
function fordir($dirname){
    //打開目錄資源
    $dir=opendir($dirname);
    
    readdir($dir);
    readdir($dir);
    while($file=readdir($dir)){
        $nfile=$dirname.'/'.$file;
        if(is_dir($nfile)
            echo "目錄:{$nfile}</br>";
            fordir($nfile);
        else 
            echo "文件:{$nfile}</br>";
    }
    closedir($dir);//關閉目錄資源
}
fordir($dirname);

加載自定義的函數庫

  • 代碼重用
    • 通過重複使用已有的代碼,提高開發效率,降低成本
  • include()和require()函數
    • require()將一個文件在預處理期間被導入,像把文件粘貼到使用函數的地方
    • include()與require()幾乎等價,區別在於腳本執行時包含,當處理失敗時,include()產生一個警告而require()則導致一個致命錯誤
  • include_once()、require_once()函數
    • 與include()、require()類似,唯一區別就是:如果該文件中的代碼已經被包括,則不會再次包括,只會包括一次。
<?php
require 'config.php';
require('config.php');
?>

匿名函數

例子:

$var=function($a,$b,$c){
    return $a+$b+$c;
};//一定要加分號結束

var_dump($var);

閉包函數

  • PHP閉包實現主要靠匿名函數
  • 將匿名函數在普通函數中當做參數傳入,並可以被返回,就實現了一個簡單的閉包
  • 通俗的說:子函數可以使用父函數中的局部變量,這種行爲就叫閉包
  • 閉包的兩個特點:
    1. 作爲一個函數變量的一個引用,當函數返回時,其處於激活狀態
    2. 一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區

連接閉包和外界變量的關鍵字:USE 閉包可以保存在代碼塊上下文的一些變量和值。PHP在默認情況下,匿名函數不能調用所在代碼塊的上下文變量,而需要通過使用 use 關鍵字
例子

<?php

function test(){
	$a = 'a';
	$b = 'b';
	$func = function($str) use ($a,$b){
			echo $str;
			echo $a;
			echo $b;
	}
	$func('asdf');
}
test();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章