文章目錄
函數定義
函數是一段完成指定任務的以命名代碼塊。 函數可以遵照給它的一組值或參數完成特定的任務,並且可能返回一個值。在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)
- 回調函數就是指調用函數時並不是傳遞一個標準的變量作爲參數,而是將另一個函數作爲參數傳遞到調用的函數中
- 變量函數
- 使用變量函數聲明和應用的回調函數
- 藉助call_user_func_array()函數自定義回調函數
- 類靜態函數和對象的方法回調
<?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 )
製作回調函數
- 使用變量函數聲明和應用回調函數
<?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");
- 藉助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");
- 類靜態函數和對象的方法回調
<?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閉包實現主要靠匿名函數
- 將匿名函數在普通函數中當做參數傳入,並可以被返回,就實現了一個簡單的閉包
- 通俗的說:子函數可以使用父函數中的局部變量,這種行爲就叫閉包
- 閉包的兩個特點:
- 作爲一個函數變量的一個引用,當函數返回時,其處於激活狀態
- 一個閉包就是當一個函數返回時,一個沒有釋放資源的棧區
連接閉包和外界變量的關鍵字: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();