PHP常用函式篇
1.為什麼要使用函式?
除了內建的PHP函式,我們可以建立我們自己的函式。
函式是可以在程式中重複使用的語句塊。
使程式碼邏輯更清晰
避免過多的全域性變數
封裝後避免相同邏輯重複程式碼,只需呼叫寫好的函式即可
便於維護,僅需修改函式邏輯即可完成所有呼叫該函式的邏輯修改,不需要多處修改
頁面載入時函式不會立即執行。
函式只有在被呼叫時才會執行。
2.函式的結構分析
//定義函式
function aa (){
//程式碼段
}
//呼叫函式
aa();
3.函式的命名規則
函式的命名規範和變數名的命名規範相同。通常函式都是執行一個動作的,因此函式命名時,一般函式中會包含動詞
這是一個簡單的命名示例
function aa(){
echo "this is function name aa";
}
aa();
4.函式的返回值
用return實現返回
function fan($height,$width){
$area=$height*$width;
return $area;
}
$total=fan(4,3);
echo $total ;
//結果12,因為3*4=12
5.函式的形參與實參
什麼是形參,什麼是實參
形參是指function後面小括號裡面的引數。
實參是指呼叫function函式的時候寫的引數.
function abc($a) //這個$a是形參
{
$a++;
echo $a;
}
$a=2;
abc($a); //這個$a是實參 輸出:3
echo $a; //輸出:2 因為傳進abc裡的是它的一副本 要想在函式內改變該值,可以用引用傳遞
6.函式的預設值
在php程式設計中,為自定義函式設定預設值,當使用者呼叫該函式時,如果不給引數指定值,引數會用預設值頂替。
function printMe($param = NULL)
{
print $param;
}
printMe("This is morenzhi function ");
printMe();
//This is morenzhi function
7.函式的強型別引數
function sum($a,$b)
{
return $a+$b;
}
var_dump(sum(1,2));
var_dump(sum(1,2.5));
//int(3) float(3.5)
8.函式的可變引數列表
必須在5.6以上版本才可以執行
function sum(...$numbers)
{
$acc = 0;
foreach( $numbers as $number )
{
$acc += $number;
}
return $acc;
}
echo sum(1,2,3,4);
//輸出
//10
9.函式值傳遞與引用傳遞
區別
(1)按值傳遞:函式範圍內對值的任何改變在函式外部都會被忽略
(2)按引用傳遞:函式範圍內對值的任何改變在函式外部也能反映出這些修改
(3)優缺點:
A:按值傳遞時,php必須複製值。特別是對於大型的字串和物件來說,這將會是一個代價很大的操作。
B.按引用傳遞則不需要複製值,對於效能提高很有好處。
header(`content-type:text/html;charset=utf-8`);
$hero = array(`no1`=>`蝙蝠俠`, `no2`=>`超人`);
$hero2 = &$hero;
$hero2[`no1`] = `蜘蛛俠`;
echo `<pre>`;
var_dump($hero);
var_dump($hero2);
$a = null;
$b = &$a;
$b = `abc`;
var_dump($a, $b);
//結果
/* array(2) {
["no1"]=>
string(9) "蜘蛛俠"
["no2"]=>
string(6) "超人"
}
array(2) {
["no1"]=>
string(9) "蜘蛛俠"
["no2"]=>
string(6) "超人"
}
string(3) "abc"
string(3) "abc" */
10.函式變數作用域
在所有函式外定義的變數擁有全域性作用域,在函式內部宣告的變數是區域性變數,僅能在函式內部訪問。要在一個函式中使用全域性變數,需要使用global關鍵字。
//使用global關鍵字
<?php
$x=10;
$y=20;
function test(){
global $x,$y;
$y=$x+$y;
}
test();
echo $y;//輸出30
11.複雜函式-可變函式
如果一個變數名後面有括號,PHP將尋找與該變數值同名的函式,並且嘗試執行它。PHP”可變函式”可以用來實現包括回撥函式、函式表在內的一些用途。
”可變函式“不能用於語言結構,如echo(),print(),unset(),isset(),empty(),include(),require()等,需要使用自定義的包裝函式來將這些結構用作可變函式。
function echoString($str){
echo($str);
}
$varFun="echoString";
$varFun=("Output String");//輸出"Output String"
12.複雜函式-巢狀函式
巢狀函式,是一種有條件全域性,你可以控制,在什麼情況下提供這樣的全域性函式給使用者使用。但也需要注意,過多的全域性函式則會產生“全域性汙染”,所以,不可多用
function foo()
{
function bar()
{
echo "this is qiantao function";
}
}
/* 現在還不能呼叫bar()函式,因為它還不存在 */
foo();//結果空
/* 現在可以呼叫bar()函式了,因為foo()函式
的執行使得bar()函式變為已定義的函式 */
bar();//結果this is qiantao function
13.複雜函式-遞迴函式 ++ —
什麼是遞迴函式?
一個函式在它的函式體內呼叫它自身稱為遞迴呼叫。 這種函式稱為遞迴函式。
php 遞迴函式的三種實現方式
利用引用做引數
函式之間本來也是各行其是,即便是同名函式。遞迴函式是考慮將引用作為引數,成為一個橋樑,形成兩個函式間的資料共享。雖然兩個函式見貌似操作的是不同地址,但是實際上操作的是一塊兒記憶體地址。
function test($a=0,&$result=array()){
$a++;
if ($a<10) {
$result[]=$a;
test($a,$result);
}
echo $a;
return $result;
}
本例比較有意思的是echo
a的值。相信很多人認為是12345678910吧,其實不然,是1098765432。為什麼呢?因為函式還沒執行echo, a前就進行了下一次的函式遞迴。真正執行echo 是當a是當a<10條件不滿足的時候,echo 返回a,返回result,對於上一層而言,執行完遞迴函式,開始執行本層的echo $a,依次類推。
利用全域性變數
利用全域性變數完成遞迴函式,請確保你確實理解什麼是全域性變數。global在函式內申明變數不過是外部變數的同名引用。變數的作用範圍仍然在本函式範圍內。改變這些變數的值,外部同名變數的值自然也改變了。但一旦用了&,同名變數不再是同名引用。利用全域性變數實現遞迴函式沒必要理解到這麼深的一層,還保持原有對全域性變數的看法就可以順理成章理解遞迴函式。
function test1($a=0,$result=array()){
global $result;
$a++;
if ($a<10) {
$result[]=$a;
test1($a,$result);
}
return $result;
}
利用靜態變數
我們常常在類中見到static,今天我們把它利用到遞迴函式中。請記住static的作用:僅在第一次呼叫函式的時候對變數進行初始化,並且保留變數值。
function test(){
static $count=0;
echo $count;
$count++;
}
test();
test();
test();
test();
test();
請問這一段程式碼的執行結果是多少?是00000麼?必然不是。是01234。首先第一次呼叫test(),static對 $count 進行初始化,其後每一次執行完都會保留 $count 的值,不再進行初始化,相當於直接忽略了 static $count=0; 這一句。
因而將static應用到遞迴函式作用可想而知。在將需要作為遞迴函式間作為“橋樑”的變數利用static進行初始化,每一次遞迴都會保留”橋樑變數”的值。
function test3($a=0){
static $result=array();
$a++;
if ($a<10) {
$result[]=$a;
test3($a);
}
return $result;
}
總結
所謂遞迴函式,重點是如何處理函式呼叫自身是如何保證所需要的結果得以在函式間合理”傳遞”,當然也有不需要函式之間傳值得遞迴函式
14.複雜函式-匿名(閉包)函式
匿名函式
提到閉包就不得不想起匿名函式,也叫閉包函式(closures),貌似PHP閉包實現主要就是靠它。宣告一個匿名函式是這樣
$func = function() {
};//帶結束符
可以看到,匿名函式因為沒有名字,如果要使用它,需要將其返回給一個變數。匿名函式也像普通函式一樣可以宣告引數,呼叫方法也相同:
$func = function( $niming ) {
echo $niming;
};
$func( `this is niming function` );
//輸出:
//this is niming function
實現閉包
將匿名函式在普通函式中當做引數傳入,也可以被返回。這就實現了一個簡單的閉包。
下邊有三個例子。
//例一
//在函式裡定義一個匿名函式,並且呼叫它
function bibao() {
$func = function( $str ) {
echo $str;
};
$func( `tihs is bibao` );
}
bibao();
//輸出
//tihs is bibao
//例二
//在函式中把匿名函式返回,並且呼叫它
function getPrintStrFunc() {
$func = function( $str ) {
echo $str;
};
return $func;
}
$printStrFunc = getPrintStrFunc();
$printStrFunc( `this is niming function fanhui` );
//輸出
//this is niming function fanhui
//例三
//把匿名函式當做引數傳遞,並且呼叫它
function callFunc( $func ) {
$func( `this is niming function canshu chuandi` );
}
$printStrFunc = function( $str ) {
echo $str;
};
callFunc( $printStrFunc );
//輸出
//this is niming function canshu chuandi
//也可以直接將匿名函式進行傳遞。如果你瞭解js,這種寫法可能會很熟悉
callFunc( function( $str ) {
echo $str;
} );
//輸出
//this is niming function canshu chuandi
連線閉包和外界變數的關鍵字:USE
閉包可以儲存所在程式碼塊上下文的一些變數和值。PHP在預設情況下,匿名函式不能呼叫所在程式碼塊的上下文變數,而需要通過使用use關鍵字。
有人可能會想到,是否可以在匿名函式中改變上下文的變數,但我發現是不可以的:
function getMoney() {
$rmb = 1;
$func = function() use ( $rmb ) {
echo $rmb;
//把$rmb的值加1
$rmb++;
};
$func();
echo $rmb;
}
getMoney();
//輸出:
//1
//1
原來use所引用的也只不過是變數的一個副本而已。但是我想要完全引用變數,而不是複製。
要達到這種效果,其實在變數前加一個 & 符號就可以了:
function getMoney() {
$rmb = 1;
$func = function() use ( &$rmb ) {
echo $rmb;
//把$rmb的值加1
$rmb++;
};
$func();
echo $rmb;
}
getMoney();
//輸出:
//1
//2
這些就是PHP的常用函式,對於PHP函式來說,只要把這幾個瞭解透徹,開發一定沒有什麼問題。