【php基础入门】细说PHP中的函数声明与使用详解(重要)
目錄
- 一、PHP函數(shù)
- 1. PHP定義函數(shù)
- 命名函數(shù)
- 匿名函數(shù)
- 2. PHP函數(shù)參數(shù)傳遞
- 值傳遞
- 引用參數(shù)
- 必選參數(shù)
- 可選參數(shù)(默認值參數(shù))
- 不定參數(shù)
- 剩余參數(shù)
- 3. PHP聲明參數(shù)類型
- 4. PHP 函數(shù)返回值
- 5. PHP可變函數(shù)
- 6. PHP閉包函數(shù)
- 7. PHP回調(diào)函數(shù)
- 8. PHP遞歸函數(shù)
- 9. PHP命名空間
- 二、結(jié)束
- 今日份函數(shù)
一、PHP函數(shù)
在日常開發(fā)中,如果有一個功能或者一段代碼要經(jīng)常使用,則可以把它寫成一個自定義函數(shù),在需要的時候進行調(diào)用。
在程序中調(diào)用函數(shù)是為了簡化編程的負擔,減少代碼量和提高開發(fā)效率,達到增加代碼重用性、避免重復開發(fā)的目的。
我們先來看一個創(chuàng)建5行3列表格的案例
$table = "<table border='1' cellspacing='0' fontSize='32' bgColor='red'>"; for($i=0;$i<5;$i++){$table .="<tr>";for($j=0;$j<3;$j++){$table .= "<td>帥</td>";}$table .="</tr>"; } $table .= "</table>"; echo $table;那么,我們現(xiàn)在的需求變了,又需要創(chuàng)建3行2列綠色的表格了,這時候我們還要復制前面的代碼,進行循環(huán)次數(shù)的修改,這樣過于麻煩,并不能做到代碼的復用性。所以我們可以把創(chuàng)建表格的代碼封裝成一個函數(shù),我們調(diào)用時只要提供幾行幾列參數(shù)來生成即可。
自定義函數(shù)
function createTable(int $rows,int $cls,string $bgColor="red",string $content="帥"){$table = "<table border='1' cellspacing='0' fontSize='32' bgColor='{$bgColor}'>";for($i=0;$i<$rows;$i++){$table .="<tr>";for($j=0;$j<$cls;$j++){$table .= "<td>{$content}</td>";}$table .="</tr>";}return $table .= "</table>"; } echo createTable(3,2,'green');系統(tǒng)函數(shù)(內(nèi)置的提前定義好的,直接調(diào)用即可)
// 絕對值函數(shù) echo abs(-3.1415926); // 3.1415926 // 字符串長度 echo strlen('nihao'); // 5 echo strlen('你好'); // 6個字符 // 小寫轉(zhuǎn)大寫 echo strtoupper('hello world'); // HELLO WORLD // 生成隨機數(shù) echo mt_rand(0,100); // 數(shù)組長度 echo count([1,2,3,4]); // 41. PHP定義函數(shù)
命名函數(shù)
在 PHP 中聲明一個自定義的命名函數(shù)可以使用下面的語法格式:
function 函數(shù)名稱(類型限定 參數(shù)列表): 返回值類型 {// 函數(shù)體 return 返回值;// 沒有return 則返回null }定義一個函數(shù),來實現(xiàn)簡單的加法運算
<?php// 提示:只要聲明的函數(shù)在腳本中可見,就可以通過函數(shù)名在腳本的任意位置進行調(diào)用,在 PHP 中可以在函數(shù)的聲明之后調(diào)用,也可以在函數(shù)的聲明之前調(diào)用,還可以在函數(shù)中調(diào)用函數(shù)。$sum = add(6,8);echo '$sum = '.$sum.'<br>';// 自動提升到腳本的頂部,在全局的任何地方都可以調(diào)用到函數(shù)function add(float $num1, float $num2):float{$a = $num1 + $num2;return $a;}// 不管是自定義的函數(shù)還是系統(tǒng)函數(shù),如果函數(shù)不被調(diào)用,就不會執(zhí)行。只要在需要使用函數(shù)的位置,使用函數(shù)名稱和參數(shù)列表進行調(diào)用即可。$sum = add(11,5);echo '$sum = '.$sum.'<br>'; ?>匿名函數(shù)
匿名函數(shù)的聲明一般是將整個函數(shù)賦值給一個變量,通過變量可以調(diào)用該函數(shù)。變量本身就是函數(shù)本身,調(diào)用 變量名(參數(shù))即可。匿名函數(shù)沒有聲明提升,和變量一樣必須先聲明在訪問。
$fn = function(){// 函數(shù)體return 返回值; }; // 匿名函數(shù)要以分號結(jié)尾我們來定義一個匿名函數(shù)
$str = function(){return "hello world!"; } echo $str(); // 自調(diào)用的匿名函數(shù) (function(){echo 'run……'; })();2. PHP函數(shù)參數(shù)傳遞
如果函數(shù)沒有參數(shù)列表,函數(shù)執(zhí)行的任務(wù)就是固定的,用戶在調(diào)用函數(shù)時不能改變函數(shù)內(nèi)部的一些執(zhí)行行為。
如果函數(shù)有參數(shù)列表,函數(shù)就可以從外部獲取函數(shù)執(zhí)行所需要的數(shù)據(jù)值。也就是用戶在調(diào)用函數(shù)時,在函數(shù)體還沒有執(zhí)行之前,將一些數(shù)據(jù)通過函數(shù)的參數(shù)列表傳遞到函數(shù)內(nèi)部,這樣函數(shù)在執(zhí)行函數(shù)體時,就可以根據(jù)用戶傳遞過來的數(shù)據(jù)決定函數(shù)體內(nèi)部如何執(zhí)行。
根據(jù)參數(shù)使用的位置,參數(shù)分為形式參數(shù)和實際參數(shù)兩種。
形式參數(shù)(形參)
形式參數(shù)就是定義函數(shù)時函數(shù)名后面括號內(nèi)的參數(shù)列表(簡稱“形參”),就像它的名字一樣,形參本身沒有具體的值。因為函數(shù)體中需要使用外部傳入的參數(shù),為了使參數(shù)可以正確地傳遞進來,就需要通過形式參數(shù)與函數(shù)體里面的數(shù)據(jù)進行傳遞,形式參數(shù)如下圖所示。
實際參數(shù)(實參)
實際參數(shù)就是我們在調(diào)用函數(shù)時函數(shù)名后面括號中的若干個參數(shù)(簡稱“實參”),實參和形參需要按順序一一對應(yīng),它會替換形式參數(shù)在函數(shù)體中對應(yīng)的變量值,函數(shù)的參數(shù)可以是一個具體的值,也可以是一個變量,實際參數(shù)如下圖所示。
在調(diào)用函數(shù)時,需要向函數(shù)傳遞參數(shù),被傳入函數(shù)的參數(shù)稱為實參,而函數(shù)定義的參數(shù)稱為形參。而向函數(shù)傳遞參數(shù)的方式有四種,分別是值傳遞、引用傳遞、可選參數(shù)(默認值參數(shù))和可變長度參數(shù)。
值傳遞
<?php// 值傳遞是 PHP 中函數(shù)的默認傳值方式,也稱為“拷貝傳值”。function swap($a, $b){echo '函數(shù)內(nèi),交換前 $a = '.$a.', $b = '.$b.'<br>';$temp = $a;$a = $b;$b = $temp;echo '函數(shù)內(nèi),交換后 $a = '.$a.', $b = '.$b.'<br>';}$x = 5;$y = 7;echo '函數(shù)外,交換前 $x = '.$x.', $y = '.$y.'<br>';swap($x, $y);echo '函數(shù)外,交換后 $x = '.$x.', $y = '.$y; /* 函數(shù)外,交換前 $x = 5, $y = 7 函數(shù)內(nèi),交換前 $a = 5, $b = 7 函數(shù)內(nèi),交換后 $a = 7, $b = 5 函數(shù)外,交換后 $x = 5, $y = 7 */ // 函數(shù)外部,數(shù)值卻沒有變化 ?>引用參數(shù)
<?php // 引用傳遞的方式就是在值傳遞的基礎(chǔ)上加上一個&符號function swap(&$a, &$b){echo '函數(shù)內(nèi),交換前 $a = '.$a.', $b = '.$b.'<br>';$temp = $a;$a = $b;$b = $temp;echo '函數(shù)內(nèi),交換后 $a = '.$a.', $b = '.$b.'<br>';}$x = 5;$y = 7;echo '函數(shù)外,交換前 $x = '.$x.', $y = '.$y.'<br>';swap($x, $y);echo '函數(shù)外,交換后 $x = '.$x.', $y = '.$y; /* 函數(shù)外,交換前 $x = 5, $y = 7 函數(shù)內(nèi),交換前 $a = 5, $b = 7 函數(shù)內(nèi),交換后 $a = 7, $b = 5 函數(shù)外,交換后 $x = 7, $y = 5 */ // 由于是引用傳參,函數(shù)體內(nèi)外的變量值是一同發(fā)生改變的 // 相當于吧x和y的內(nèi)存儲存區(qū)塊相對地址導入到函數(shù)中了,在函數(shù)體內(nèi)發(fā)生的任何變化,都會對外邊傳進去的變量造成影響。 ?>必選參數(shù)
// 必選參數(shù) function hello(string $name):string{return "hello $name"; } echo hello("zhang"); // hello zhang // 會將標量類型自動轉(zhuǎn)換為字符串 echo hello(123); // hello 123 echo hello(true); // hello 1 echo hello(); // 必選參數(shù) 不傳參會報致命錯誤可選參數(shù)(默認值參數(shù))
// 可選參數(shù) (默認值參數(shù)) // 默認參數(shù)就是給函數(shù)的某個或多個形式參數(shù)指定一個默認的值,如果調(diào)用函數(shù)時不傳入對應(yīng)的值,那么函數(shù)就會使用這個默認值,這樣可以避免調(diào)用時出現(xiàn)沒有參數(shù)的錯誤 function hello(string $name = "zhang"):string{return "hello $name"; } echo hello(); // hello zhang echo hello("shuai"); // hello shuai// 注意:當有多個參數(shù)時,可選參數(shù)必須放在最后面。 function user($name,$gender,$age=18,$city="合肥"):string{return sprintf("姓名:%s 性別:%s 年齡:%d 城市:%s",$name,$gender,$age,$city); } // 姓名和性別為必選參數(shù)不可以省略 echo user('zhang','男'); // 姓名:zhang 性別:男 年齡:18 城市:合肥 echo user('zhang','男',20); // 姓名:zhang 性別:男 年齡:20 城市:合肥不定參數(shù)
// 不定參數(shù) function add(float $a,float $b,float $c):float {return $a+$b+$c; } echo add(1,2,3); // 6// 如果有跟多的值計算參數(shù)非常多,以上函數(shù)就顯得非常麻煩 function add(){// 通過函數(shù)中內(nèi)置的三個函數(shù)獲取到參數(shù)的全部信息// 1. 參數(shù)有幾個?$n = func_num_args();// 2. 參數(shù)組成的數(shù)組$arr = func_get_args();// 將數(shù)組轉(zhuǎn)換為字符串$args = implode(',',$arr);// 3. 獲取某一個參數(shù)$arg = func_get_arg(1);printf('參數(shù)數(shù)量:%d<br>參數(shù)分別為%s<br>第二個參數(shù)為%d',$n,$args,$arg); } add(1,2,3,4,5,6);// 求N個數(shù)的和 function sum(){// array_sum 求數(shù)組的和echo "參數(shù)之和:".array_sum(func_get_args()); } sum(8,9,8,56,4,84,26);剩余參數(shù)
// js中的...rest語法剩余參數(shù) // 函數(shù)的形式參數(shù)可使用 … 來表示函數(shù)可接受一個可變數(shù)量的參數(shù),可變參數(shù)將會被當作一個數(shù)組傳遞給函數(shù) function rest(...$args){print_r($args); // Array ( [0] => 6 [1] => 5 [2] => 4 [3] => 3 [4] => 2 [5] => 1 )echo "<br>";echo count($args); // 6echo "<br>";echo array_sum($args); // 21 } rest(6,5,4,3,2,1);// 計算數(shù)組的和 // ...$args 歸并數(shù)組 [666,888,999,689] function sum(...$args){return array_sum($args); } $num = array(666,888,999,689); // ...$num 解構(gòu)數(shù)組 666,888,999,689 echo sum(...$num); // 3242 echo ...[6,7,8];//------------------------------- // 剩余參數(shù)實戰(zhàn)場景 (數(shù)據(jù)庫連接) function connect(...$arg){return new PDO($arg[0],$arg[1],$arg[2]); } $pdo = connect('mysql:dbname=sys','root','root'); echo $pdo?'連接成功':"連接失敗";3. PHP聲明參數(shù)類型
在 PHP 7 中增加了參數(shù)可聲明的類型種類,我們可以限制函數(shù)的傳入?yún)?shù)類型和返回值類型
| class/interface name(類,接口) | 參數(shù)必須是指定類或接口的實例 |
| Array | 參數(shù)為數(shù)組類型 |
| Callable | 參數(shù)為有效的回調(diào)類型 |
| Bool | 參數(shù)為布爾型 |
| Float | 參數(shù)為浮點型 |
| Int | 參數(shù)為整型 |
| String | 參數(shù)為字符串 |
在 PHP 7 中,可以使用declare(strict_types=1)設(shè)置嚴格模式,這樣只有在傳遞的參數(shù)與函數(shù)期望得到的參數(shù)類型一致時才能正確執(zhí)行,否則會拋出錯誤。只有一種情況例外,就是當函數(shù)期望得到的是一個浮點型數(shù)據(jù)而提供的是整型時,函數(shù)也能正常被調(diào)用。
<?php declare(strict_types=1); function test(int $a, int $b, string $c){echo ($a + $b);echo " the string is $c"; } test(3.8,2,'hello'); ?>4. PHP 函數(shù)返回值
使用 return 語句時需要注意以下幾點:
- return 語句用于向“調(diào)用函數(shù)者”返回一個值,返回值后,立即結(jié)束函數(shù)運行,所以 return 語句一般都放在函數(shù)的末尾;
- 如果一個函數(shù)中存在多個 return 語句,則只會執(zhí)行第 1 個;
- return 語句也可以不返回參數(shù),就相當于結(jié)束函數(shù)運行;
- 如果在全局作用域內(nèi)使用 return 語句,則會立即終止當前運行的腳本;
- 如果使用 include 或 require 引入的腳本文件中含有 return 語句,則會返回到引入腳本的地方繼續(xù)向下執(zhí)行,return 之后的其它代碼不再執(zhí)行。
在 PHP7 中增加了一個新功能——聲明返回值類型。與聲明參數(shù)類型相似,在非嚴格模式下,PHP 將會嘗試將返回值類型轉(zhuǎn)換為聲明的類型,如果轉(zhuǎn)換失敗會報一個 Fatal error 錯誤。
// 多個值可以 以數(shù)組的形式返回 function demo1():array{return ['status'=>1,'msg'=>'驗證成功!']; } $res = demo1(); echo $res['status']==1?$res['msg']:'驗證失敗……'; // 驗證成功// -------------------------------------echo '<hr>'; // 返回一個對象 function demo2():object{// 返回一個匿名類return new class(){public $name = 'admin';public $email = 'admin@php.com';}; } $user = demo2(); echo "<pre>"; // 對象成員的訪問 -> echo $user->name; echo $user->email; var_dump($user); /* object(class@anonymous)#1 (2) {["name"]=>string(5) "admin"["email"]=>string(13) "admin@php.com" } */// -------------------------------------// 返回一個轉(zhuǎn)為JSON格式的字符串 function demo3():string{// json_encode() 第二個參數(shù)格式// JSON_UNESCAPED_UNICODE 不將中文轉(zhuǎn)義為Unicode編碼return json_encode(['status'=>1,'msg'=>'驗證成功!'],JSON_UNESCAPED_UNICODE); } $json_str = demo3(); echo $json_str; /* { "status": 1, "msg": "驗證成功!", "img":"https:\/\/up.keaitupian.com\/\/uploads\/allimg\/170111\/1_170111233712_1.jpg" } */ // 需要將JSON格式的字符串解析為PHP能夠處理的數(shù)據(jù)類型 json_decode() $res = json_decode($json_str); echo "<pre>"; var_dump($res); /* 轉(zhuǎn)換成了對象 object(stdClass)#1 (3) {["status"]=>int(1)["msg"]=>string(15) "驗證成功!"["img"]=>string(69) "https://up.keaitupian.com//uploads/allimg/170111/1_170111233712_1.jpg" } */ // 那么我們可以指定json_decode()第二個參數(shù)為true將轉(zhuǎn)換為數(shù)組 $res = json_decode($json_str,true); echo "<pre>"; var_dump($res); /* array(3) {["status"]=>int(1)["msg"]=>string(15) "驗證成功!"["img"]=>string(69) "https://up.keaitupian.com//uploads/allimg/170111/1_170111233712_1.jpg" */// -------------------------------------// 以序列化字符串返回 function demo4():string{return serialize(['status'=>1,'msg'=>'驗證成功!','code'=>256]); } $str = demo4(); echo $str; // a:3:{s:6:"status";i:1;s:3:"msg";s:15:"驗證成功!";s:4:"code";i:256;} // 作為日志打印到文件中 file_put_contents('file.txt',$str);// 還原為PHP可以處理的數(shù)據(jù)類型 $res= unserialize($str); echo "<pre>"; var_dump($res); /* array(3) {["status"]=>int(1)["msg"]=>string(15) "驗證成功!"["code"]=>int(256) } */5. PHP可變函數(shù)
PHP 中支持可變函數(shù)的概念(也叫變量函數(shù)),可以這樣理解,如果一個變量名后有小括號( ),那么 PHP 就會尋找與變量值同名的函數(shù)并執(zhí)行它。也就是說如果給一個變量賦不同的值,程序就會調(diào)用不同的函數(shù)。
需要注意的是,可變函數(shù)不能直接用于例如 echo、print、unset()、isset()、empty()、include、require 以及類似的語言結(jié)構(gòu),需要使用自己包裝的函數(shù)來將這些結(jié)構(gòu)用作可變函數(shù)。
<?phpfunction website(){echo 'php中文網(wǎng)<br>';}function url($str = ''){echo $str.'<br>';}function title($string){echo $string;}$funcname = 'website';$funcname();$funcname = 'url';$funcname('zhang.com');$funcname = 'title';$string = 'PHP 教程';$funcname($string);// 相當于$title('PHP 教程'); ?>6. PHP閉包函數(shù)
閉包是指在創(chuàng)建時封裝周圍狀態(tài)的函數(shù)。即使閉包所在的環(huán)境不存在了,閉包中封裝的狀態(tài)依然存在。
匿名函數(shù)就是沒有名稱的函數(shù)。匿名函數(shù)可以賦值給變量,還能像其他任何PHP對象那樣傳遞。不過匿名函數(shù)仍是函數(shù),因此可以調(diào)用,還可以傳入?yún)?shù)。匿名函數(shù)特別適合作為函數(shù)或方法的回調(diào)。
注意:理論上講,閉包和匿名函數(shù)是不同的概念。不過,PHP將其視作相同的概念。所以,我們提到閉包時,指的也是匿名函數(shù),反之亦然。
PHP閉包和匿名函數(shù)使用的句法與普通函數(shù)相同,但閉包和匿名函數(shù)其實是 偽裝成函數(shù)的對象(Closure類的實例)。
我們通常把PHP閉包當做函數(shù)和方法的回調(diào)使用。很多PHP函數(shù)都會用到回調(diào)函數(shù),例如 array_map() 和 preg_replace_callback() .如下示例,我們將用 array_map() 處理數(shù)組,將數(shù)組每一項進行平方操作:
$numbers = [1, -2, 3, -4, 5]; $squares = array_map(function ($number) {return $number ** 2; }, $numbers); print_r($squares); /* Array ([0] => 1[1] => 4[2] => 9[3] => 16[4] => 25 ) */PHP閉包不會像真正的javascript閉包那樣自動封裝應(yīng)用的狀態(tài),我們必須手動調(diào)用閉包對象的 bindTo() 方法或者使用 use 關(guān)鍵字,把狀態(tài)附加到PHP閉包上。
// 不使用global和$GLOBALS來獲取全局作用域下的變量 $name = 'zhang'; $age = 18; $closure = function() use($name,$age){return sprintf('姓名:%s 年齡:%d',$name,$age); }; echo $closure()."<br>"; // 姓名:zhang 年齡:18// 使用引用傳參配合use來改變函數(shù)體外傳遞進來的參數(shù)值 echo $name."<br>"; // zhang $closure2 = function($myName) use(&$name){$name = $myName; }; $closure2('shuai'); echo $name."<br>"; // shuai閉包應(yīng)用場景
// 閉包經(jīng)常用作于函數(shù)的返回值 function Car($name,$owner){return function($statu,$color="pink") use ($name,$owner){return sprintf("<p style='color:$color'>Car %s is %s and myname is %s<p>",$name,$statu,$owner);}; } // Car 的返回值是一個閉包函數(shù) $car = Car('bwm','wudy'); echo $car('running'); //Car bwm is running and myname is wudy // 簡寫()()連續(xù)調(diào)用 echo Car('特斯拉','寶馬')('突突突突','green');7. PHP回調(diào)函數(shù)
所謂的回調(diào)函數(shù),就是指調(diào)用函數(shù)時并不是向函數(shù)中傳遞一個標準的變量作為參數(shù),而是將另一個函數(shù)作為參數(shù)傳遞到調(diào)用的函數(shù)中,這個作為參數(shù)的函數(shù)就是回調(diào)函數(shù)。通俗的來說,回調(diào)函數(shù)也是一個我們定義的函數(shù),但是不是我們直接來調(diào)用的,而是通過另一個函數(shù)來調(diào)用的,這個函數(shù)通過接收回調(diào)函數(shù)的名字和參數(shù)來實現(xiàn)對它的調(diào)用。
<?phpfunction arithmetic($funcName, $m, $n) {return $funcName($m, $n);}function add($m,$n){return $m+$n;}function sub($m,$n){return $m-$n;}function mul($m,$n){return $m*$n;}function exc($m,$n){return $m/$n;}$sum = arithmetic('add', 5, 9);echo '5 + 9 ='.$sum;// 也可以直接編寫為匿名函數(shù)進行回調(diào) (回調(diào)函數(shù)是將用戶自定義的過程或行為當做函數(shù)的參數(shù)傳遞)$sum = arithmetic(function($m,$n){return $m-$n;}, 9, 5);echo '9 - 5 ='.$sum;// php 單線程,同步執(zhí)行,如果遇到該函數(shù)非常耗時就會阻塞,應(yīng)該將他設(shè)置為異步函數(shù)。$sub = function($m,$n){return $m-$n;};echo $sub(8,4); // 系統(tǒng)內(nèi)置函數(shù)回調(diào)函數(shù)回調(diào)一個全局函數(shù)// call_user_func(函數(shù)名稱,參數(shù)列表)echo call_user_func($sub,6,8);// call_user_func_arrya(函數(shù)名稱,[參數(shù)數(shù)組]) echo call_user_func_array($sub,[9,3]);// 這兩個函數(shù)還可以異步的回調(diào)對象方法 class User{// 實例方法public function hello($name,$address):string{return "hello {$name} {$address}";}// 靜態(tài)方法:類調(diào)用public static function sya($site){$str = "";// 循環(huán)一個特別耗時的變量for($i=0;$i<10000;$i++){$str .= $i;}return "welcome {$site}";} } // 異步調(diào)用對象的實例方法 第一個參數(shù)是數(shù)組 實例對象 方法名稱 echo call_user_func_array([new User,'hello'],['zhang',"先生"]); // hello zhang 先生 // 異步調(diào)用對象的靜態(tài)方法 echo call_user_func('User::sya','baidu');?>實例演示數(shù)據(jù)庫鏈接查詢
$sql = "select * from sys_config limit 2"; $mysql = function($dsn,$username,$password)use($sql){$pdo = new PDO($dsn,$username,$password);$stmt = $pdo->prepare($sql);$stmt->execute();return $stmt->fetchALL(PDO::FETCH_ASSOC); }; // 回調(diào)一個匿名函數(shù) $res = call_user_func_array($mysql,['mysql:dbname=sys','root','root']); echo "<pre>"; print_r($res); /* Array ([0] => Array([variable] => diagnostics.allow_i_s_tables[value] => OFF[set_time] => 2019-07-25 13:30:15[set_by] => )[1] => Array([variable] => diagnostics.include_raw[value] => OFF[set_time] => 2019-07-25 13:30:15[set_by] => )) */很多PHP函數(shù)都會用到回調(diào)函數(shù),例如 array_map() 和 array_filter()
$arr = [2,3,4,5]; // 將數(shù)組的每一項乘以2,返回一個新數(shù)組 $res = array_map(function($v){return $v*2; },$arr); echo "<pre>"; print_r($arr); print_r($res); /* Array ([0] => 2[1] => 3[2] => 4[3] => 5 ) Array ([0] => 4[1] => 6[2] => 8[3] => 10 ) */ // 過濾出數(shù)組中大于7的數(shù) $res = array_filter($res,function($v){return $v>7; }); print_r($res); /* Array ([2] => 8[3] => 10 ) */8. PHP遞歸函數(shù)
遞歸函數(shù)即自調(diào)用函數(shù),也就是函數(shù)在函數(shù)體內(nèi)部直接或間接地自己調(diào)用自己。需要注意的是使用遞歸函數(shù)時通常會在函數(shù)體中附加一個判斷條件,以判斷是否需要繼續(xù)執(zhí)行遞歸調(diào)用,當條件滿足時會終止函數(shù)的遞歸調(diào)用。
想要實現(xiàn)遞歸,需滿足以下兩個條件:
- 子問題需與原始問題為同樣的事,且更為簡單。
- 不能無限制地調(diào)用本身,必須有一個出口,化簡為非遞歸狀況處理。
實例演示:利用遞歸刪除目錄下的所有文件
// 遞歸函數(shù):自己調(diào)用自己,要有調(diào)用條件 function delete_dir_file($dir){// 聲明一個初始狀態(tài),默認情況下緩存未被刪除$init = false;if(is_dir($dir)){// 成功打開目錄流if($handle = opendir($dir)){// 讀取目錄流while(($file = readdir($handle))){// echo $file."<br>";/*...demo.phpfunction.php*/if($file!='.'&&$file!=".."){// echo "$dir.'\\'.$file";// 判斷子目錄是否合法if(is_dir($dir.'\\'.$file)){delete_dir_file($dir.'\\'.$file);}else{// 檢測到非目錄 是文件// 刪除文件 (只能刪除文件,不能刪除目錄)unlink($dir.'\\'.$file);}}}}// 關(guān)閉目錄句柄closedir($handle);// 刪除空目錄if(rmdir($dir)){$init = true;}}return $init; } // 刪除當前目錄下的所有文件 $res = delete_dir_file(__DIR__); echo $res?'緩存目錄刪除成功!':'';9. PHP命名空間
命名空間一個最明確的目的就是解決重名問題,PHP中不允許兩個函數(shù)或者類出現(xiàn)相同的名字,否則會產(chǎn)生一個致命的錯誤。這種情況下只要避免命名重復就可以解決,最常見的一種做法是約定一個前綴。
命名空間將代碼劃分出不同的空間(區(qū)域),每個空間的常量、函數(shù)、類(為了偷懶,我下邊都將它們稱為元素)的名字互不影響, 這個有點類似我們常常提到的’封裝’的概念。
<?php //創(chuàng)建一個名為'Article'的命名空間 namespace Article;//此Comment屬于Article空間的元素 class Comment { }const PATH = '/article';function getCommentTotal() {return 100; }// --------------------------//創(chuàng)建一個名為'MessageBoard'的命名空間 namespace MessageBoard;const PATH = '/message_board';function getCommentTotal() {return 300; }//此Comment屬于MessageBoard空間的元素 class Comment { }//調(diào)用當前空間(MessageBoard) echo PATH; ///message_board echo getCommentTotal(); //300 $comment = new Comment();// ------------------------------//調(diào)用Article空間的常量、函數(shù)和類 // 在MessageBoard空間中調(diào)用article空間里的Comment類時,使用了一種像文件路徑的語法: \空間名\元素名 echo \Article\PATH; ///article echo \Article\getCommentTotal(); //100 $article_comment = new \Article\Comment(); ?>二、結(jié)束
今日份函數(shù)
- abs() 絕對值函數(shù)
- strlen() 獲取字符串長度函數(shù)
- strtoupper() 小寫字母轉(zhuǎn)大寫函數(shù)
- mt_rand() 隨機生成數(shù)函數(shù)
- count() 獲取數(shù)組長度函數(shù)
- array_sum() 數(shù)組元素求和函數(shù)
- implode() 將數(shù)組以指定字符串分割
- extract() 將數(shù)組拆分為獨立的變量
今日語錄:生活就像坐公交車一樣,就算公交上空無一人 ,司機也會把車開到終點。
附:博客鏈接
【php基礎(chǔ)入門】PHP環(huán)境搭建與初識php代碼書寫及演示PHP和JS中遍歷數(shù)組的區(qū)別等知識點學習筆記
【php基礎(chǔ)入門】細說php的變量以及常量的知識點詳解
【php基礎(chǔ)入門】運算符、流程控制語句及單雙引號區(qū)別和模塊化編程的使用詳解
總結(jié)
以上是生活随笔為你收集整理的【php基础入门】细说PHP中的函数声明与使用详解(重要)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《精通Python设计模式》学习之原型模
- 下一篇: php 获取某个月的周一