PHP閉包實現函數的自調用實現遞歸

根據pathinfo訪問對應得controller,如ip:port/home/index/index則會訪問home目錄下的IndexController的index方法;若是不指定pathinfo則訪問home目錄下的IndexController的index方法php

service service層: $sql = 'select * from admin_user where id=1'; $data['sql'] = $sql; $data['info'] = yield table('admin_user')->where(['id'=>1])->find(); return $data; controller層: //使用1-封裝在service層,controller層也得寫yield $testservice = new TestService(); $data = yield $testservice->test(); return $data; Cache-redis(已是異步非阻塞)mysql

配置:redis

return [ 'redis'=>[ 'ip' => 'localhost', 'port' => 6379, 'select' => 0, 'password' => '', 'asyn_max_count' => 10, ] ];sql

使用:數據庫

$data = yield Db::redis()->cache('abcd');數組

只要在config目錄下配置cache文件,便可在業務裏調用緩存方法,如:緩存

數據庫 mysql(已是異步非阻塞)閉包

在config下配置mysql的配置文件,便可在業務中使用,你可使用如下方法查詢數據框架

$data = yield Db::table()->query('select* from admin_user'); $a = yield DB::table()->query('select*from admin_user where id =1'); $userinfo = yield table('admin_user')->where(['id'=>1])->find(); http client(已是異步非阻塞) $httpClient = new HttpClientCoroutine(); $data = yield $httpClient->request('http://speak.test.com/'); 框架所有封裝好.怎麼樣,這異步用起來是否是很簡單^_^ mongo(仍是同步阻塞的)異步

 

php的閉包可能不經常使用,可是在某些場合之下仍是能夠考慮用php的閉包來實現某些功能的,好比遞歸,這裏講一下用php的閉包實現遞歸

 //php閉包實現函數的自調用,也就是實現遞歸

function closure($n,$counter,$max){

//匿名函數,這裏函數的參數加&符號是,引址調用參數本身

$fn = function (&$n,&$counter,&$max=1) use(&$fn){//use參數傳遞的是函數閉包函數自身

$n++;

if($n < $max){//遞歸點,也就是遞歸的條件

$counter .=$n.'<br />';

//遞歸調用本身

$fn($n,$counter,$max);

}

return $counter;

};//記得這裏必須加``;``分號,不加分號php會報錯,閉包函數

/*

*這裏函數closure的返回值就是調用閉包的匿名函數

*而閉包函數,引用closure函數傳進來的參數

*/

return $fn($n,$counter,$max);

}

echo (closure(0,'',10));

這是一個簡單的使用php閉包實現遞歸的函數,其實,假如咱們對這個函數稍微修改一下,是能夠實現不少功能的,好比說,無限極分類。

關於裏面的閉包函數,其實,咱們也能夠不用引用外面的closure參數,裏面的閉包函數的參數,咱們能夠在closure的內部設置。

咱們也能夠不用返回閉包函數的值,由於閉包函數是在closure函數裏面,咱們能夠在closure裏面設置一下變量傳遞給閉包函數,而後,用閉包遞歸獲取咱們想要的東西存儲在數組中,再利用closure函數返回閉包函數獲取的東西,因此,閉包函數也能夠沒有返回值的,關鍵是你要獲取什麼東西。

總之,你只要利用這個閉包函數實現你要的東西,而後返回你須要的東西便可,不必定非要從閉包函數的返回值中獲取。

相關文章
相關標籤/搜索