您好,登錄后才能下訂單哦!
函數(shù)的定義:函數(shù)就是一段封裝好的代碼塊,可以隨時(shí)調(diào)用。在PHP中有兩種函數(shù):自定義函數(shù)與系統(tǒng)函數(shù)。
自定義函數(shù)語(yǔ)法格式:
function 函數(shù)名稱([參數(shù)1,[參數(shù)2]....])
{
函數(shù)體(程序內(nèi)容敘述)
[return 返回值;]
}
注:[]里的東西可有可無(wú)
自定義函數(shù)的名稱:
它是函數(shù)在程序代碼中的識(shí)別名稱,函數(shù)名可以是以字母或下劃線開頭后跟零個(gè)或多個(gè)字母、下劃線和數(shù)字的任何字符串。
符合變量名的命名規(guī)則
函數(shù)名不區(qū)分大小寫。
函數(shù)名不能重復(fù),命名函數(shù)函數(shù)時(shí)不可使用已經(jīng)聲明的函數(shù)(這個(gè)和變量的命名不同,變量可以覆蓋前一個(gè)變量名,而函數(shù)不可以),和PHP系統(tǒng)函數(shù)名稱。
函數(shù)名稱和變量名稱的區(qū)別:
變量名嚴(yán)格區(qū)分大小寫,函數(shù)名不區(qū)分大小寫。
參數(shù)(可以分為形參和實(shí)參):
所謂參數(shù)就是:用來(lái)把數(shù)值從函數(shù)外部傳入函數(shù)體中,并用來(lái)加以運(yùn)算處理。
參數(shù)之間用“,”隔開,當(dāng)函數(shù)不需要任何數(shù)值傳入時(shí),可以省略參數(shù)。
形參:聲明函數(shù)時(shí),函數(shù)名后面括號(hào)內(nèi)的表達(dá)式稱為形參。
function table(形參1,形參2){}
實(shí)參:被調(diào)用函數(shù)名后面括號(hào)中的表達(dá)式稱為實(shí)參。
table(實(shí)參1,實(shí)參2);
實(shí)參和形參需要按順序?qū)?yīng)傳遞數(shù)據(jù)。
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');
注意:函數(shù)參數(shù)中,沒有默認(rèn)值的放到前面,有默認(rèn)值的放在參數(shù)列表中的后邊。
table2($rows,$cols,$color = 'yellow')
返回值:
當(dāng)調(diào)用函數(shù)時(shí)需要它返回一些數(shù)值,那么就要在函數(shù)體中用return語(yǔ)句實(shí)現(xiàn)。
格式如下:
return 返回值;//返回值可以是變量也可以是一個(gè)表達(dá)式
exit(); //無(wú)返回值 void
return語(yǔ)句在函數(shù)體中使用時(shí),有以下兩個(gè)作用:
return語(yǔ)句可以向函數(shù)調(diào)用者返回函數(shù)體中任意確定的值。
將程序控制權(quán)返回到調(diào)用者的作用域,即退出函數(shù)。在函數(shù)中如果執(zhí)行了return語(yǔ)句,它后面的語(yǔ)句就不會(huì)被執(zhí)行了。
說明:如果函數(shù)沒有返回值,就只能算是一個(gè)執(zhí)行過程,只依靠函數(shù)做一些事情還不夠,有時(shí)更需要在程序腳本中
使用函數(shù)執(zhí)行后的結(jié)果。由于變量的作用域的差異,調(diào)用函數(shù)的腳本程序不能直接使用函數(shù)體里面的信息,但可以通過關(guān)鍵字return向調(diào)用者傳遞數(shù)據(jù)。
echo與return:
echo直接輸出到瀏覽器,不能再加工,不能賦值給變量
return可以賦值給變量,變量是數(shù)據(jù)的臨時(shí)容器(return返回一個(gè)值,等待一個(gè)變量接收它)
注意: 如果函數(shù)有返回值,當(dāng)函數(shù)執(zhí)行完畢時(shí)就會(huì)將return后面的值返回到調(diào)用函數(shù)的位置處,這樣就可以把函數(shù)名稱當(dāng)作函數(shù)返回的值使用。(這時(shí)調(diào)用函數(shù)時(shí)對(duì)ruturn后面的值是不管用的(retrun的值已經(jīng)返回到調(diào)用函數(shù)的位置處,return以前的輸出還是可以照樣輸出),因?yàn)樗呀?jīng)變成某個(gè)值了無(wú)法用funName();輸出,需要echo funName()才可以輸出。)
<?php
header("content-type:text/html;charset=utf-8");
//在函數(shù)的聲明之前調(diào)用
echo show();
echo '<hr>';
function show()
{
echo 'ccc';
return 'aaa';
//return所在行之后的代碼不會(huì)執(zhí)行
echo 111;
}
//函數(shù)的調(diào)用,不會(huì)將return后面的值返回
show();
echo '<hr>';
//return返回的值 需要一個(gè)變量來(lái)接收它
$result = show();
echo $result;
echo '<hr>';
//也可以直接輸出 函數(shù)名稱
echo show();
echo '<hr>';
輸出結(jié)果:
cccaaa
ccc
cccaaa
cccaaa
函數(shù)的調(diào)用:
格式:函數(shù)名();
說明:table();
不管是自定義函數(shù)還是系統(tǒng)函數(shù),如果函數(shù)不被調(diào)用,就不會(huì)執(zhí)行。
通過函數(shù)名稱去調(diào)用函數(shù),并讓函數(shù)體的代碼運(yùn)行,調(diào)用幾次函數(shù)體就會(huì)執(zhí)行幾次。
在PHP中可以在函數(shù)的聲明之后調(diào)用,也可以在函數(shù)的聲明之前調(diào)用,還可以在函數(shù)中調(diào)用函數(shù)。
駝峰命名法:
function showInfo()
{
}
function ShowInfo()
{
}
判斷函數(shù)是否存在: function_exists()
if(function_exists('table')){
echo 'table';
}else{
echo 'table函數(shù)不存在,請(qǐng)先定義table函數(shù)';
}
PHP變量的范圍:
局部變量
全局變量
靜態(tài)變量
<?php
$username = 'shifang';
function stu()
{
$name = 'libai';
echo $name;
//無(wú)法調(diào)用外部的$username,而在函數(shù)體內(nèi)也沒有聲明$username
10 echo $username;
echo 'xxxx';
}
stu();
//函數(shù)體外無(wú)法調(diào)用函數(shù)體內(nèi)的變量
16.echo $name;
echo $username;
結(jié)果:
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的頁(yè)面中聲明的變量,叫“全局變量”.
函數(shù)內(nèi)的變量叫“局部變量”.
二者沒有半毛錢關(guān)系:函數(shù)內(nèi)的變量,外部無(wú)法調(diào)用,函數(shù)外的變量,函數(shù)無(wú)法調(diào)用
(某戲班子到某學(xué)校唱戲,兩者的花名冊(cè)都不可相互調(diào)用)
靜態(tài)變量:
PHP支持聲明函數(shù)變量為靜態(tài)的(static)。
一個(gè)靜態(tài)變量在所有對(duì)該函數(shù)的調(diào)用之間共享,并且僅在腳本的執(zhí)行期間函數(shù)第一次被調(diào)用時(shí)被初始化。
要聲明函數(shù)變量為靜態(tài)的用關(guān)鍵字static,通常,靜態(tài)變量的第一次使用時(shí)賦予一個(gè)初始值。
<?php
function tongji()
{
static $n = 0;
echo $n;
$n++;
}
tongji();
tongji();
tongji();
echo '<hr>';
function jishu()
{
$m = 0;
echo $m;
$m++;
}
jishu();
jishu();
jishu();
輸出結(jié)果:
0123
00000
函數(shù)內(nèi)如何調(diào)用函數(shù)外的變量?
1、傳參
2、引用傳參---"&"
下邊的兩種方法不推薦使用,因?yàn)槠淦茐牧撕瘮?shù)的封裝性
3、聲明全局變量 global
function t2()
{
global $a;
echo $a;
}
t2();
4、超級(jí)全局變量,在頁(yè)面的任何部分,包括函數(shù),方法等,都可以直接訪問
$GLOBALS
超級(jí)全局變量(9個(gè)):
$_GET //地址欄上獲得的值
$_POST //POST表單發(fā)送的數(shù)據(jù)
$_REQUEST //既有GET,也有POST的內(nèi)容,需要在php.ini中配置
$_SESSION
$_COOKIE
$_FILES
$_ENV //服務(wù)器操作系統(tǒng)的環(huán)境變量,如操作系統(tǒng),Linux,win ,mac,環(huán)境變量等等;容易暴露服務(wù)器信息,一般不允許顯示,需要在php.ini中配置
$_SERVER //獲取網(wǎng)站的域名,以及當(dāng)前訪問的腳本,客戶端IP(REMOTE_ADDR,HTTP_X_FORWARD_FOR)
$GLOBALS //是對(duì)全局變量花名冊(cè)的一個(gè)別名,通過該變量,可以任意訪問全局變量
搜索如果禁用了$_ENV變量,還有什么辦法獲取環(huán)境信息?
<?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';
}
//無(wú)法輸出
getData();
echo '<hr>';
$result = getData();
echo $result;
echo '<hr>';
echo getData();
echo '<hr>';
//超全局變量,不僅可以獲取外邊的變量,還可以改變變量的值
echo $username;
echo '<hr>';
輸出結(jié)果:
dufu
xiaolibailibailibai
PHP函數(shù)的各種形式(分類):
常規(guī)參數(shù)函數(shù)
偽類型參數(shù)函數(shù) mixed number callable | callback
默認(rèn)參數(shù)函數(shù) function table($rows,$cols=3,$color= 'red');
可變長(zhǎng)度參數(shù)函數(shù) func_get_args() func_get_arg(1) func_num_args();
引用參數(shù)函數(shù) function mysort(&$arr){};
回調(diào)函數(shù) usort(), uksort(),
遞歸函數(shù)
匿名函數(shù)
1、常規(guī)參數(shù)函數(shù)
格式說明:
string example(string name, int age, double height)
所謂的常規(guī)參數(shù)函數(shù)就是實(shí)參和形參應(yīng)該個(gè)數(shù)相等,類型一致。
<?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、偽類型參數(shù)函數(shù)
主要用于查看手冊(cè)時(shí),查看各種需要的類型,在實(shí)際的代碼中很少用到,有這么概念就行,偽類型可以理解為什么類型都可以。
格式說明:
mixed funName(mixed $args) #在參數(shù)列表中出現(xiàn)類型使用 mixed 描述的參數(shù)
number funName(number $args) #在參數(shù)列表中出現(xiàn)類型使用 number 描述的參數(shù)
PHP中函數(shù)的每個(gè)參數(shù),都可以為其傳遞任意類型的值。
PHP的偽類型,包括mixed(任意類型)、number(int ,float)、callback(函數(shù)名)三種。
3、默認(rèn)參數(shù)函數(shù)
格式說明:mixed funName(string name[,string value[,int expire]]) #在參數(shù)列表中出現(xiàn)使用[ ]描述的參數(shù)
<?php
//一個(gè)函數(shù):只要有一個(gè)參數(shù)有默認(rèn)值,該函數(shù)就叫默認(rèn)參數(shù)函數(shù)
//默認(rèn)參數(shù):有默認(rèn)值的參數(shù)放在 參數(shù)列表 后面,前面的 形參個(gè)數(shù) 要求與 傳入實(shí)參 時(shí)的 個(gè)數(shù)和類型必須一致
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、可變長(zhǎng)度參數(shù)函數(shù)
格式說明:
mixed funName(string arg1 [,string...]) #在參數(shù)列表中出現(xiàn)使用“...”描述的參數(shù)
使用默認(rèn)參數(shù)函數(shù)適合實(shí)參個(gè)數(shù)少于形參的情況,而可變長(zhǎng)度參數(shù)函數(shù)則適合實(shí)參個(gè)數(shù)多于形參的情況。
如果希望函數(shù)可以接受任意數(shù)量的參數(shù),需要在函數(shù)中使用PHP系統(tǒng)提供的func_get_args()函數(shù),它將所有傳遞個(gè)腳本函數(shù)的參數(shù)當(dāng)作一個(gè)數(shù)組返回。
獲取所有傳入的參數(shù):func_get_args();
獲取所有傳入?yún)?shù)的個(gè)數(shù): func_num_args();
單獨(dú)獲取指定的參數(shù): func_get_arg(n);
<?php
//可變長(zhǎng)度參數(shù)函數(shù):傳入的參數(shù)個(gè)數(shù)是不確定的
function show()
{
//獲取所有傳入的參數(shù),并將其轉(zhuǎn)為一個(gè)數(shù)組返回
$arr = func_get_args();
//輸出的$arr為數(shù)組
print_r($arr);
//獲取所有傳入?yún)?shù)的個(gè)數(shù)
echo func_num_args();
//單獨(dú)獲取指定的參數(shù),需要傳入?yún)?shù)的順序號(hào),從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');
輸出結(jié)果:
5
Array ( [0] => a [1] => n [2] => x [3] => y [4] => z )
y
姓名:小二
年齡:18
aihao:nvkeguan
teshuaihao:hejiu
5、引用參數(shù)函數(shù)
格式說明:void funName(array &arg) #在參數(shù)列表中出現(xiàn)使用 & 描述的函數(shù)
<?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是數(shù)組所以無(wú)法輸出數(shù)組?
show($arr);
echo '<pre>';
print_r($arr);
echo '<hr>';
echo '<pre>';
sort($arr);
print_r($arr);
輸出結(jié)果:
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)
{
//局部變量無(wú)法使用全局變量,報(bào)錯(cuò)
echo $var;
echo '<br>';
//傳參$var=100
echo $arg;
echo '<br>';
//改變局部變量的值,輸出200
$arg=200;
echo $arg;
}
testi($var);
//改變局部變量的值,不會(huì)影響全局變量
echo $var;
echo '<hr>';
function test(&$arg)
{
//局部變量無(wú)法使用全局變量,報(bào)錯(cuò)
echo $var;
echo '<br>';
//傳參
echo $arg;
echo '<br>';
//改變局部變量的值,輸出200
$arg=200;
echo $arg;
}
test($var);
//改變局部變量,全局變量的值也被改變200
echo $var;
輸出結(jié)果:
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、回調(diào)參數(shù)函數(shù)
格式說明:
mixed funName( callback arg ) #在參數(shù)列表中使用偽類型 callback 描述
所謂回調(diào)函數(shù),就是指調(diào)用函數(shù)時(shí)并不是傳遞一個(gè)標(biāo)準(zhǔn)的變量作為參數(shù),而是將另一個(gè)函數(shù)作為參數(shù)傳遞到調(diào)用的函數(shù)中。
函數(shù)參數(shù)中,有一個(gè)參數(shù)值是另一個(gè)函數(shù)的函數(shù)名,那么這個(gè)函數(shù)就是回調(diào)函數(shù)
如果在函數(shù)的格式說明中,出現(xiàn)“callback”類型的參數(shù),該函數(shù)就是回調(diào)函數(shù)。
callback也屬于PHP中偽類型的一種,說明函數(shù)的參數(shù)需要接受另一個(gè)函數(shù)作為實(shí)參。
使用回調(diào)函數(shù)的目的是可以將一段自己定義的功能傳到函數(shù)內(nèi)部使用。
變量函數(shù)
變量函數(shù)也稱為可變函數(shù)。如果一個(gè)變量名后有圓括號(hào),PHP將尋找與變量的值同名的函數(shù),并且將嘗試執(zhí)行它。
2使用變量函數(shù)聲明和應(yīng)用回調(diào)函數(shù)
3借助call_user_func_array()函數(shù)自定義回調(diào)函數(shù)
格式說明:mixed call_user_func_array(callback function,array param_arr)
該函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)因?yàn)槭褂脗晤愋蚦allback,所以這個(gè)參數(shù)需要是一個(gè)字符串,表示要調(diào)用的函數(shù)名,第二個(gè)參數(shù)則是一個(gè)數(shù)組類型參數(shù),表示參數(shù)列表,按照順序依次會(huì)傳遞給要調(diào)用的函數(shù)。
<?php
function fun($msg1,$msg2){
echo '$msg1='.$msg1.'<br>';
echo '$msg12='.$msg2;
}
call_user_func_array('fun',array('lamp','兄弟連'));
結(jié)果:
$msg1=lamp
$msg12=兄弟連
4靜態(tài)類函數(shù)和對(duì)象的方法回調(diào)
<?php
echo '<pre>';
$arr = [199,1,24,789,213,123];
usort($arr,'myfun');
function myfun($x,$y){
return $y-$x;
}
print_r($arr);
結(jié)果:
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();
//自定義的回調(diào)函數(shù)
function show($func){
//myfun();
$func();
}
show('myfun');
結(jié)果:this is a function
7、遞歸函數(shù)
遞歸函數(shù)即自調(diào)用函數(shù)。
<?php
$n = 10;
function jianfa($x){
//執(zhí)行遞減
$x--;
//輸出傳入的參數(shù)值
echo $x;
//如果$a大于零就繼續(xù)調(diào)用函數(shù)本身
if($x > 0){
jianfa($x);
}else{
//如果不大于0就輸出字符串
echo '<=====>';
}
//輸出$a的值
echo $x;
}
jianfa($n);
結(jié)果:
9876543210<=======>0123456789
8、匿名函數(shù)
1、它沒有函數(shù)名
2,可以賦值給一個(gè)變量 $bianliang = function(參數(shù))use(變量){//函數(shù)體};
3,所有回調(diào)函數(shù)中,回調(diào)參數(shù)位置都可以用匿名函數(shù)替代。
4,可以使用use直接調(diào)用外部的變量($arr),如果引用外部變量(&$arr),在內(nèi)部可以更改外部的變量值
<?php
//1,第一種用法:將匿名函數(shù)數(shù)賦值給一個(gè)變量,調(diào)用的時(shí)候 $變量名(參數(shù)..);
$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;
結(jié)果:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
green
&符,將內(nèi)部的變量值把外部的變量改變
使用自定義函數(shù)庫(kù):
include();
require();
include(); require(); 語(yǔ)句是語(yǔ)言結(jié)構(gòu),不是真正的函數(shù)
<?php
//包含文件到當(dāng)前的位置。而 include 只產(chǎn)生警告(E_WARNING),腳本會(huì)繼續(xù)運(yùn)行。
include '04table.php';
//包含文件到當(dāng)前的位置。require 在出錯(cuò)時(shí)產(chǎn)生 E_COMPILE_ERROR 級(jí)別的錯(cuò)誤。
require('04table.php');
echo table(5,5);
inculde_once();
require_once();
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。