PHP的函數應用

函數的定義:函數就是一段封裝好的代碼塊,可以隨時調用。在PHP中有兩種函數:自定義函數系統函數

自定義函數語法格式:

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

{

函數體(程序內容敘述)

[return 返回值;]

}

注:[]裏的東西可有可無

自定義函數的名稱:


  1. 它是函數在程序代碼中的識別名稱,函數名可以是以字母或下劃線開頭後跟零個或多個字母、下劃線和數字的任何字符串。

  2. 符合變量名的命名規則

  3. 函數名不區分大小寫。

  4. 函數名不能重複,命名函數函數時不可使用已經聲明的函數(這個和變量的命名不同,變量可以覆蓋前一個變量名,而函數不可以),和PHP系統函數名稱。

函數名稱和變量名稱的區別:

變量名嚴格區分大小寫,函數名不區分大小寫。


參數(可以分爲形參和實參):

所謂參數就是:用來把數值從函數外部傳入函數體中,並用來加以運算處理。

參數之間用“,”隔開,當函數不需要任何數值傳入時,可以省略參數。

形參:聲明函數時,函數名後面括號內的表達式稱爲形參。

function table(形參1,形參2){}

實參:被調用函數名後面括號中的表達式稱爲實參。

table(實參1,實參2);

實參和形參需要按順序對應傳遞數據。


function table2($rows,$cols,$color='yellow')
{
    echo '<table border="1" bgcolor="'.$color.'">';
    for($i = 0;$i < $rows;$i++){
        echo '<tr>';
        for($n = 0;$n <$cols;$n++){
            echo '<td>'.($i*$rows+$n).'</td>';
        }
        echo '</tr>';
    }
}

table2(10,10,'red');



注意:函數參數中,沒有默認值的放到前面,有默認值的放在參數列表中的後邊。

table2($rows,$cols,$color = 'yellow')


返回值:

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

格式如下:

return 返回值;//返回值可以是變量也可以是一個表達式

exit();        //無返回值 void

return語句在函數體中使用時,有以下兩個作用:


  1. return語句可以向函數調用者返回函數體中任意確定的值

  2. 將程序控制權返回到調用者的作用域,即退出函數。在函數中如果執行了return語句,它後面的語句就不會被執行了。


說明:如果函數沒有返回值,就只能算是一個執行過程,只依靠函數做一些事情還不夠,有時更需要在程序腳本中

使用函數執行後的結果。由於變量的作用域的差異,調用函數的腳本程序不能直接使用函數體裏面的信息,但可以通過關鍵字return向調用者傳遞數據

echo與return:

echo直接輸出到瀏覽器,不能再加工,不能賦值給變量

return可以賦值給變量,變量是數據的臨時容器(return返回一個值,等待一個變量接收它)

注意:    如果函數有返回值,當函數執行完畢時就會將return後面的值返回到調用函數的位置處,這樣就可以把函數名稱當作函數返回的值使用。(這時調用函數時對ruturn後面的值是不管用的(retrun的值已經返回到調用函數的位置處,return以前的輸出還是可以照樣輸出),因爲她已經變成某個值了無法用funName();輸出,需要echo funName()纔可以輸出。)



<?php

header("content-type:text/html;charset=utf-8");

//在函數的聲明之前調用
echo show();
echo '<hr>';

function show()
{
    echo 'ccc';

    return 'aaa';

    //return所在行之後的代碼不會執行
    echo 111;
}

//函數的調用,不會將return後面的值返回
show();
echo '<hr>';

//return返回的值 需要一個變量來接收它
$result = show();
echo $result;
echo '<hr>';


//也可以直接輸出 函數名稱
echo show();
echo '<hr>';



輸出結果:

cccaaa


ccc


cccaaa


cccaaa


函數的調用:

格式:函數名();

說明:table();


  1. 不管是自定義函數還是系統函數,如果函數不被調用,就不會執行。

  2. 通過函數名稱去調用函數,並讓函數體的代碼運行,調用幾次函數體就會執行幾次。

  3. 在PHP中可以在函數的聲明之後調用,也可以在函數的聲明之前調用,還可以在函數中調用函數。


駝峯命名法:


function showInfo()
{

}

function ShowInfo()
{

}


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

if(function_exists('table')){
    echo 'table';
}else{
    echo 'table函數不存在,請先定義table函數';
}


PHP變量的範圍:


  • 局部變量

  • 全局變量

  • 靜態變量




<?php
$username = 'shifang';

function stu()
{
    $name = 'libai';
    echo $name;

    //無法調用外部的$username,而在函數體內也沒有聲明$username
10   echo $username;
    echo 'xxxx';
}

stu();

//函數體外無法調用函數體內的變量
16.echo $name;
echo $username;


結果:

libai


Notice: Undefined variable: username in D:\xampp\htdocs\89\Exercise\2014-7-28 PHP function\007quanju.php on line 10


xxxx


Notice: Undefined variable: name in D:\xampp\htdocs\89\Exercise\2014-7-28 PHP function\007quanju.php on line 16


shifang




在PHP的頁面中聲明的變量,叫“全局變量”.

函數內的變量叫“局部變量”.

二者沒有半毛錢關係:函數內的變量,外部無法調用,函數外的變量,函數無法調用

(某戲班子到某學校唱戲,兩者的花名冊都不可相互調用)

靜態變量:


  •  PHP支持聲明函數變量爲靜態的(static)。

  • 一個靜態變量在所有對該函數的調用之間共享,並且僅在腳本的執行期間函數第一次被調用時被初始化。

  • 要聲明函數變量爲靜態的用關鍵字static,通常,靜態變量的第一次使用時賦予一個初始值。




<?php
function tongji()
{
    static $n = 0;
    echo $n;
    $n++;
}
tongji();
tongji();
tongji();
echo '<hr>';

function jishu()
{
    $m = 0;
    echo $m;
    $m++;
}
jishu();
jishu();
jishu();

輸出結果:

0123


00000



函數內如何調用函數外的變量?

1、傳參

2、引用傳參---"&"

下邊的兩種方法不推薦使用,因爲其破壞了函數的封裝性

3、聲明全局變量 global

function t2()

{
global $a;
echo $a;
}
t2();


4、超級全局變量,在頁面的任何部分,包括函數,方法等,都可以直接訪問

$GLOBALS

超級全局變量(9個):


  1. $_GET //地址欄上獲得的值

  2. $_POST    //POST表單發送的數據

  3. $_REQUEST    //既有GET,也有POST的內容,需要在php.ini中配置

  4. $_SESSION

  5. $_COOKIE

  6. $_FILES

  7. $_ENV    //服務器操作系統的環境變量,如操作系統,Linux,win ,mac,環境變量等等;容易暴露服務器信息,一般不允許顯示,需要在php.ini中配置

  8. $_SERVER    //獲取網站的域名,以及當前訪問的腳本,客戶端IP(REMOTE_ADDR,HTTP_X_FORWARD_FOR)

  9. $GLOBALS     //是對全局變量花名冊的一個別名,通過該變量,可以任意訪問全局變量



搜索如果禁用了$_ENV變量,還有什麼辦法獲取環境信息?




<?php


//使用return
function show()
{
    $username = 'dufu';
    return $username;
}

//輸出dufu
echo show();
echo '<hr>';

$username = 'xiao';
echo $username;
echo '<hr>';

function getData()

{
    return $GLOBALS['username'= 'libai';
}

//無法輸出
getData();
echo '<hr>';

$result = getData();
echo $result;
echo '<hr>';

echo getData();
echo '<hr>';

//超全局變量,不僅可以獲取外邊的變量,還可以改變變量的值
echo $username;
echo '<hr>';


輸出結果:

dufu


xiaolibailibailibai



PHP函數的各種形式(分類):


  1. 常規參數函數

  2. 僞類型參數函數 mixed number  callable | callback

  3. 默認參數函數    function table($rows,$cols=3,$color= 'red');

  4. 可變長度參數函數 func_get_args() func_get_arg(1) func_num_args();

  5. 引用參數函數    function mysort(&$arr){};

  6. 回調函數    usort(),    uksort(),

  7. 遞歸函數

  8. 匿名函數


1、常規參數函數

格式說明:

string    example(string name, int age, double height)


所謂的常規參數函數就是實參和形參應該個數相等,類型一致。



<?php

function table2($rows,$cols,$color="yellow"){
    echo '<table border="1" bgcolor="'.$color.'">';
    for($i = 0;$i < $rows;$i++){
        echo '<tr>';
        for($n = 0;$n <$cols;$n++){
            echo '<td>'.($i*$rows+$n).'</td>';
        }
        echo '</tr>';
    }
}

table2(10,10,'red');



2、僞類型參數函數

主要用於查看手冊時,查看各種需要的類型,在實際的代碼中很少用到,有這麼概念就行,僞類型可以理解爲什麼類型都可以。

格式說明:

mixed funName(mixed $args)        #在參數列表中出現類型使用 mixed 描述的參數

number funName(number $args)      #在參數列表中出現類型使用 number 描述的參數


PHP中函數的每個參數,都可以爲其傳遞任意類型的值。

PHP的僞類型,包括mixed(任意類型)、number(int ,float)、callback(函數名)三種。

3、默認參數函數

格式說明:mixed funName(string name[,string value[,int expire]])        #在參數列表中出現使用[ ]描述的參數


<?php


//一個函數:只要有一個參數有默認值,該函數就叫默認參數函數
//默認參數:有默認值的參數放在 參數列表 後面,前面的 形參個數 要求與 傳入實參 時的 個數和類型必須一致

function table($rows = 10,$cols = 10,$color = 'red')
{
    echo '<table border="1" bgcolor="'.$color.'">';
    for($i = 0; $i < $rows; $i++){
        echo '<tr>';
        for($n = 0; $n < $cols; $n++){
            echo '<td>'.($i*$cols+$n).'</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}
table(3,3,'blue');
table();



4、可變長度參數函數

格式說明:

mixed funName(string arg1 [,string...])      #在參數列表中出現使用“...”描述的參數

使用默認參數函數適合實參個數少於形參的情況,而可變長度參數函數則適合實參個數多於形參的情況。

如果希望函數可以接受任意數量的參數,需要在函數中使用PHP系統提供的func_get_args()函數,它將所有傳遞個腳本函數的參數當作一個數組返回。

獲取所有傳入的參數:func_get_args();

獲取所有傳入參數的個數:    func_num_args();

單獨獲取指定的參數:    func_get_arg(n);


<?php

//可變長度參數函數:傳入的參數個數是不確定的
function show()
{
    //獲取所有傳入的參數,並將其轉爲一個數組返回
    $arr = func_get_args();

 
    //輸出的$arr爲數組  

     print_r($arr);


    //獲取所有傳入參數的個數
    echo func_num_args();

    
    //單獨獲取指定的參數,需要傳入參數的順序號,從0開始
    echo func_get_arg(3);
}
show('a','n','x','y','z');

function getInfo(){
    $num = func_num_args();
    for($i = 0;$i < $num;$i++){
        echo func_get_arg($i).'<br>';
    }
}
getInfo('姓名:小二','年齡:18','aihao:nvkeguan','teshuaihao:hejiu');


輸出結果:

5

Array ( [0] => a [1] => n [2] => x [3] => y [4] => z )

y

姓名:小二

年齡:18
aihao:nvkeguan
teshuaihao:hejiu



5、引用參數函數

格式說明:void funName(array &arg)        #在參數列表中出現使用 & 描述的函數


<?php

$arr = array(98,66,1,23,12,5);

echo '<pre>';
print_r($arr);

function show(&$crr){
    for($i = 0;$i <4; $i++){
        ($crr[$i] += 5).'<br>';
    }
}

//$crr = &$arr;$arr是數組所以無法輸出數組?
show($arr);


echo '<pre>';
print_r($arr);

echo '<hr>';
echo '<pre>';
sort($arr);
print_r($arr);


輸出結果:

Array

(

    [0] => 98

    [1] => 66

    [2] => 1

    [3] => 23

    [4] => 12

    [5] => 5

)


Array

(

    [0] => 103

    [1] => 71

    [2] => 6

    [3] => 28

    [4] => 12

    [5] => 5

)


Array

(

    [0] => 5

    [1] => 6

    [2] => 12

    [3] => 28

    [4] => 71

    [5] => 103

)


<?php
$var=100;

function testi($arg)
{
    //局部變量無法使用全局變量,報錯
    echo $var;
    echo '<br>';

    //傳參$var=100
    echo $arg;
    echo '<br>';
    //改變局部變量的值,輸出200
    $arg=200;
    echo $arg;
}

testi($var);

//改變局部變量的值,不會影響全局變量
echo $var;

echo '<hr>';

function test(&$arg)
{
    //局部變量無法使用全局變量,報錯
    echo $var;
    echo '<br>';

    //傳參
    echo $arg;
    echo '<br>';
    //改變局部變量的值,輸出200
    $arg=200;
    echo $arg;
}

test($var);

//改變局部變量,全局變量的值也被改變200
echo $var;

輸出結果:

Notice: Undefined variable: var in D:\xampp\htdocs\89\HomeWork\moxie\yinyon.php on line 7

100
200100



Notice: Undefined variable: var in D:\xampp\htdocs\89\HomeWork\moxie\yinyon.php on line 28

100
200200



6、回調參數函數

格式說明:

mixed funName( callback arg )            #在參數列表中使用僞類型 callback 描述


所謂回調函數,就是指調用函數時並不是傳遞一個標準的變量作爲參數,而是將另一個函數作爲參數傳遞到調用的函數中

函數參數中,有一個參數值是另一個函數的函數名,那麼這個函數就是回調函數

如果在函數的格式說明中,出現“callback”類型的參數,該函數就是回調函數。

callback也屬於PHP中僞類型的一種,說明函數的參數需要接受另一個函數作爲實參

使用回調函數的目的是可以將一段自己定義的功能傳到函數內部使用。


  1. 變量函數

變量函數也稱爲可變函數。如果一個變量名後有圓括號,PHP將尋找與變量的值同名的函數,並且將嘗試執行它。

  1. 2使用變量函數聲明和應用回調函數

  2. 3藉助call_user_func_array()函數自定義回調函數

    1. 格式說明:mixed call_user_func_array(callback function,array param_arr)

    2. 該函數有兩個參數,第一個參數因爲使用僞類型callback,所以這個參數需要是一個字符串,表示要調用的函數名,第二個參數則是一個數組類型參數,表示參數列表,按照順序依次會傳遞給要調用的函數。

<?php

function fun($msg1,$msg2){
    echo '$msg1='.$msg1.'<br>';
    echo '$msg12='.$msg2;
    
}

call_user_func_array('fun',array('lamp','兄弟連'));

結果:

$msg1=lamp
$msg12=兄弟連



  1. 4靜態類函數和對象的方法回調



<?php
echo '<pre>';
$arr = [199,1,24,789,213,123];
usort($arr,'myfun');
function myfun($x,$y){
    return $y-$x;
}
print_r($arr);


結果:
Array
(
    [0=> 789
    [1=> 213
    [2=> 199
    [3=> 123
    [4=> 24
    [5=> 1
)


<?php
$bianliang = 'myfun';
function myfun()
{
    echo 'this is a function';
}
// myfun();
//$bianliang();

//自定義的回調函數
function show($func){
    //myfun();
    $func();
}
show('myfun');

結果:this is a function




7、遞歸函數

遞歸函數即自調用函數。

<?php$n = 10;
function jianfa($x){
   //執行遞減
    $x--;
    //輸出傳入的參數值
    echo $x;
    //如果$a大於零就繼續調用函數本身
    if($x > 0){
        jianfa($x);
    }else{
      //如果不大於0就輸出字符串
       echo '<=====>';
    }
    //輸出$a的值
    echo $x;
}
jianfa($n);

結果:

9876543210<=======>0123456789



spacer.gif

8、匿名函數


1、它沒有函數名

2,可以賦值給一個變量  $bianliang = function(參數)use(變量){//函數體};

3,所有回調函數,回調參數位置都可以用匿名函數替代。

4,可以使用use直接調用外部的變量($arr),如果引用外部變量(&$arr),在內部可以更改外部的變量值


<?php

//1,第一種用法:將匿名函數數賦值給一個變量,調用的時候  $變量名(參數..);
$show = function($a){
    echo '代碼的處理';
    echo $a;
};
$n = 15;
$show($n);


<?php
$color = 'red';
$table = function($rows,$cols)use(&$color){
    $color = 'green';
    echo '<table border="1" bgcolor="'.$color.'">';
    for($i = 0;$i < $rows;$i++){
        echo '<tr>';
        for($n = 0;$n < $cols;$n++){
            echo '<td>'.($i*$cols+$n).'</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
};

$table(10,10);
echo $color;

結果:

0123456789
10111213141516171819
20212223242526272829
30313233343536373839
40414243444546474849
50515253545556575859
60616263646566676869
70717273747576777879
80818283848586878889
90919293949596979899

green

&符,將內部的變量值把外部的變量改變




使用自定義函數庫:

include();

require();

include(); require(); 語句是語言結構,不是真正的函數

<?php

//包含文件到當前的位置。而 include 只產生警告(E_WARNING),腳本會繼續運行。 
include '04table.php';

//包含文件到當前的位置。require 在出錯時產生 E_COMPILE_ERROR 級別的錯誤。
require('04table.php');
echo table(5,5);



inculde_once();

require_once();






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章