函數(shù)
php的函數(shù)類比c語(yǔ)言的函數(shù)蒿讥,擴(kuò)充了許多種類的函數(shù),我們將一一討論咒林,下面是這節(jié)將會(huì)講到的函數(shù)
- 普通函數(shù)
- 默認(rèn)值函數(shù)
- 參數(shù)變化函數(shù)
- 可變函數(shù)(不是參數(shù)變化)
- 回調(diào)函數(shù)
- 匿名函數(shù)
- 閉包
普通函數(shù)
普通函數(shù)就是與大多數(shù)編程語(yǔ)言一樣格式的函數(shù)肆资,我們分為有參數(shù)透敌,無(wú)參數(shù)描扯,有返回值定页,無(wú)返回值四類。
- 無(wú)參函數(shù)
格式:
function 名稱()
{
...
}
function f1()
{
echo "i am is a function";
}
f1();//i am is a function
- 有參函數(shù)
function 名稱(參數(shù)1绽诚,參數(shù)2...參數(shù)n)
{
...
}
function f1($num1,$num2)
{
echo $num1+$num2;
}
f1(10,20);//30
- 無(wú)返回值函數(shù)
function 名稱()
{
...
}
function f1()
{
echo "i am is a function";
}
f1();//i am is a function
- 有返回值函數(shù)
function 名稱($num1,$num2,...參數(shù)n)
{
...
return 變量/值
}
function f1($num1,$num2)//形參num1 num2
{
return $num1+$num2;
}
echo f1(10,20);//30,實(shí)參10,20
此處我們?cè)儆懻撓聀hp函數(shù)參數(shù)傳遞的兩種格式,一個(gè)是值傳遞杭煎,一個(gè)是引用傳遞恩够。
格式:
//值傳遞
function f1($num)
{
}
//引用傳遞
function f1(&$num)
{
}
本質(zhì)剖析:
和C語(yǔ)言一樣,值傳遞僅僅是把變量的值傳遞給函數(shù)的形參羡铲,形參無(wú)論如何操作都不會(huì)改變形參蜂桶,而引用參數(shù)傳遞就是用到前面一節(jié)講的引用的本質(zhì)就是變量本身,內(nèi)存共用也切。所以引用傳遞的變量扑媚,在函數(shù)體內(nèi)被改變腰湾,外面的參數(shù)值也會(huì)改變。
//值傳遞
function f4($num)
{
$num += 10;
return $num;
}
$num = 10;
echo $num;//10
f4($num);
echo $num;//10;
//引用傳遞
function f5(&$num)
{
$num += 10;
return $num;
}
$num = 10;
echo $num;//10
f5($num);
echo $num;//20;
默認(rèn)值函數(shù)
php的默認(rèn)值函數(shù)和C++的也是一樣的疆股,規(guī)則也大致一樣费坊。一般都是用于函數(shù)的形參個(gè)數(shù)大于等于實(shí)參個(gè)數(shù)
注意點(diǎn):函數(shù)參數(shù)的默認(rèn)值只能出現(xiàn)在最靠右的(不只是指最后一個(gè),可以是連續(xù)的倒數(shù)幾個(gè)參數(shù))旬痹,否則會(huì)出現(xiàn)未知錯(cuò)誤附井。當(dāng)參數(shù)存在默認(rèn)值時(shí),沒(méi)有實(shí)際參數(shù)時(shí)两残,會(huì)取形參默認(rèn)值永毅,存在實(shí)際參數(shù)時(shí),會(huì)取實(shí)參傳遞給形參的值人弓。
//函數(shù)參數(shù)默認(rèn)值
function f1($num1,$num2=10)
{
return $num1+$num2;
}
echo f1(10);//20沼死,參數(shù)2是默認(rèn)值
echo f1(10,20);//30
參數(shù)變化函數(shù)
正常情況下,我們認(rèn)為函數(shù)的形參個(gè)數(shù)和實(shí)參個(gè)數(shù)必須是相等的崔赌,不然如何調(diào)用漫雕,但是php的參數(shù)是可以不對(duì)等的,實(shí)參個(gè)數(shù)可以大于形參個(gè)數(shù)峰鄙,可以小于形參個(gè)數(shù)浸间,當(dāng)然也可以等于形參個(gè)數(shù)。我們直接說(shuō)實(shí)參個(gè)數(shù)大于形參個(gè)數(shù)和實(shí)參個(gè)數(shù)小于形參個(gè)數(shù)的情況吟榴。
實(shí)參個(gè)數(shù)小于形參個(gè)數(shù):通常就是函數(shù)參數(shù)帶默認(rèn)值的情況魁蒜。
//函數(shù)參數(shù)默認(rèn)值
function f1($num1,$num2=10)
{
return $num1+$num2;
}
echo f1(10);//20,參數(shù)2是默認(rèn)值
echo f1(10,20);//30
實(shí)參個(gè)數(shù)大于形參個(gè)數(shù):func_get_args()保存函數(shù)所有的傳遞過(guò)來(lái)的實(shí)參吩翻。
function f3()
{
$sum = 0;
echo func_get_args();//1,2,3
foreach (func_get_args() as $value)
{
$sum += $value;
}
echo $sum;//6
}
php5之后的版本可以用新語(yǔ)法...$變量存放當(dāng)前未被接受的實(shí)參
//格式
function f($num1,...$num2)
{
//...$num2其實(shí)就是個(gè)數(shù)組兜看,保存數(shù)字2,3狭瞎,4细移,5
}
f(1,2,3,4,5);
//求和,$num3數(shù)組保存剩余未匹配的參數(shù)
function func($num1,$num2,...$num3)
{
$sum = 0;
$sum += $num1;
$sum += $num2;
foreach($num3 as value)
{
sum += value;
}
echo sum;
}
func(1,2);//3,$num3數(shù)組是空
func(1,2,3)//6,$num3數(shù)組存放3
func(1,2,3,4)//6熊锭,$num3數(shù)組存放3和4
可變函數(shù)
可變函數(shù)是php特有的一種函數(shù)弧轧,它是用變量的值對(duì)應(yīng)函數(shù)的名稱去簡(jiǎn)介的調(diào)用函數(shù)。
可變函數(shù)的調(diào)用有兩類碗殷,一類是給變量賦不同的值精绎,按照值不同調(diào)用不同的函數(shù),還有一類是給變量賦不同的值锌妻,用call_user_func_array(變量名,接受函數(shù)參數(shù)的數(shù)組)去調(diào)用不同的函數(shù)
格式1示例:
//函數(shù)f1
function f1()
{
echo "f1";
}
//函數(shù)f2
function f2($num)
{
echo $num;
}
//函數(shù)f3
function f3($num)
{
return $num+10;
}
$num = "f1";
$num();//f1;
$num = "f2";
$num(10);//10;
$num = "f3";
echo $num(10);//20;
格式2示例
//函數(shù)f1
function f1()
{
echo "f1";
}
//函數(shù)f2
function f2($num)
{
echo $num;
}
$num = "f1";
call_user_func_array($num,array());//f1
$num = "f2";
call_user_func_array($num,array(10));//10
回調(diào)函數(shù)
回調(diào)函數(shù)就是利用當(dāng)前函數(shù)的參數(shù)作為內(nèi)部調(diào)用函數(shù)的參數(shù)代乃,執(zhí)行內(nèi)部函數(shù)的過(guò)程,通撤麓猓回調(diào)函數(shù)就是利用可變函數(shù)去完成的搁吓。
我們可以這樣理解回調(diào)函數(shù)娃兽,假設(shè)當(dāng)前函數(shù)是主線程俊嗽,在執(zhí)行當(dāng)前函數(shù)時(shí)达址,突然去調(diào)用另一個(gè)子線程函數(shù)根暑,當(dāng)子線程執(zhí)行完后,繼續(xù)往下執(zhí)行主線程贮预”词遥回調(diào)函數(shù)的調(diào)用也有兩種,一類是正常調(diào)用仿吞,第二類是用call_user_func_array()調(diào)用,call_user_func_array()其實(shí)就是前面的可變函數(shù)的調(diào)用
無(wú)參數(shù)回調(diào):
function f1()
{
echo "f1";
}
function f2()
{
echo "bbb";
f1();
echo "ccc";
}
f2();//bbbf1ccc
有參數(shù)回調(diào)
function f1($num)
{
echo $num;
}
function f2($num)
{
echo "bbb";
f1($num);
echo "ccc";
}
f2(10);//bbb10ccc
用回調(diào)函數(shù)模擬加減乘除滑频,用戶只需調(diào)用一個(gè)函數(shù)
//+
function add($num1=0,$num2=0)
{
echo $num1+$num2;
}
//-
function del($num1=0,$num2=0)
{
echo $num1-$num2;
}
//*
function div($num1=0,$num2=0)
{
echo $num1*$num2;
}
///
function mul($num1=0,$num2=0)
{
echo $num1/$num2;
}
//用回調(diào)函數(shù)智能選擇函數(shù)
function callback($choice,$num1,$num2)
{
$num = $choice;
//$num($num1,$num2);可變函數(shù)格式1
return call_user_func_array($num,array($num1,$num2));//可變函數(shù)格式2
}
callback("add",10,20);//30
callback("del",10,20);//-10
callback("div",10,20);//200
callback("mul",20,20);//1
匿名函數(shù)
匿名函數(shù)和JavaScript的匿名函數(shù)一樣,匿名的函數(shù)并不是沒(méi)有名字唤冈,簡(jiǎn)介的將名稱給了變量而已峡迷。
//匿名函數(shù)格式
$num = function ($num)
{
...
};
$num = function()
{
echo "ni ming";
};
$num();//niming
閉包函數(shù)
閉包就是函數(shù)內(nèi)部有一個(gè)匿名函數(shù),且這個(gè)函數(shù)內(nèi)部定義的變量和當(dāng)前函數(shù)的參數(shù)你虹,匿名函數(shù)不可以直接用绘搞,只可以通過(guò)use(參數(shù)1,參數(shù)2)傳遞使用
function f()
{
$num = function()
{
echo "i am ni";
};
$num();
}
f();//i am ni
function fun($num)
{
$num = function() use($num)
{
echo $num;//不能直接用傅物,必須通過(guò)use()傳遞進(jìn)去
};
$num();
}
fun(10);//10
如何調(diào)用其它php文件的全局變量/函數(shù)/類
格式:
- include "php地址"
- include_once "php地址"
- require "php地址"
- require_once "php地址"
其實(shí)總的就兩類夯辖,include和require,其中后綴加once就是保證不會(huì)重復(fù)引入php文件。require適合靜態(tài)引用董饰,在頭部引用蒿褂。而inlude適合動(dòng)態(tài)引用,在程序運(yùn)行過(guò)程中引用卒暂。
//test1.php
<?php
$num1 = 100;
function test1()
{
echo "i am is test1";
}
//test2.php
<?php
$num2 = 10;
function test2()
{
echo "i am is test2";
}
//main.php
require "test1.php";
echo num1;//100
test1();//i am is test1
if(1)
{
include "test2.php"
echo num2;//10
test2();//i am is test2
}