07-函數(shù)

函數(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
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啄栓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子也祠,更是在濱河造成了極大的恐慌昙楚,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诈嘿,死亡現(xiàn)場(chǎng)離奇詭異堪旧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)永淌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門崎场,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人遂蛀,你說(shuō)我怎么就攤上這事「珊瘢” “怎么了李滴?”我有些...
    開(kāi)封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵螃宙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我所坯,道長(zhǎng)谆扎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任芹助,我火速辦了婚禮堂湖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘状土。我一直安慰自己无蜂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布蒙谓。 她就那樣靜靜地躺著斥季,像睡著了一般。 火紅的嫁衣襯著肌膚如雪累驮。 梳的紋絲不亂的頭發(fā)上酣倾,一...
    開(kāi)封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音谤专,去河邊找鬼躁锡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛置侍,可吹牛的內(nèi)容都是我干的映之。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼墅垮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惕医!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起算色,我...
    開(kāi)封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抬伺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后灾梦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體峡钓,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年若河,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了能岩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萧福,死狀恐怖拉鹃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤膏燕,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布钥屈,位于F島的核電站,受9級(jí)特大地震影響坝辫,放射性物質(zhì)發(fā)生泄漏篷就。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一近忙、第九天 我趴在偏房一處隱蔽的房頂上張望竭业。 院中可真熱鬧,春花似錦及舍、人聲如沸未辆。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鼎姐。三九已至,卻和暖如春更振,著一層夾襖步出監(jiān)牢的瞬間炕桨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工肯腕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留献宫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓实撒,卻偏偏與公主長(zhǎng)得像姊途,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子知态,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. 定義 函數(shù)是一個(gè)被命名的捷兰,獨(dú)立的代碼段,它執(zhí)行特定的任務(wù)负敏,并可能給調(diào)用它的程序一份返回值贡茅。 PHP的模塊化程...
    楠哥哥_0b86閱讀 622評(píng)論 1 2
  • 函數(shù)和對(duì)象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語(yǔ)言來(lái)說(shuō)都是核心的概念其做。通過(guò)函數(shù)可以封裝任意多條語(yǔ)句顶考,而且...
    道無(wú)虛閱讀 4,543評(píng)論 0 5
  • 查看所有Python相關(guān)學(xué)習(xí)筆記 此篇文章用于記錄學(xué)習(xí)過(guò)程中接觸到的與函數(shù)有關(guān)的知識(shí)點(diǎn) 函數(shù): 形參:函數(shù)創(chuàng)建時(shí)括...
    殘陽(yáng)夕露閱讀 533評(píng)論 0 3
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,125評(píng)論 0 3
  • 今天是清明節(jié),朋友圈到處在發(fā)思念親人妖泄。網(wǎng)上最流行的一句是:清明淚灑萬(wàn)堆紙驹沿,不如在世一碗粥。百善孝為先蹈胡,傳承中國(guó)孝道...
    傲雪_352a閱讀 342評(píng)論 1 1