PHP中的閉包

2021-08-29 03:52:03 字數 2595 閱讀 5446

$sayhello = function($name);
$sayhello("world");
輸出 hello world

var_dump($sayhello instanceof closure);
輸出 boolean(true)

$name = 'world';

$sayhello = function() use($name);//這裡不要忘記結束的;號

$sayhello();//必須函式方式呼叫,即用(), 輸出hello world

$name = 'zj';

$sayhello();//輸出 hello world

$name = 'world';

$sayhello = function() use(&$name);//這裡不要忘記結束的;號

$sayhello();//必須函式方式呼叫,即用(), 輸出hello world

$name = 'zj';

$sayhello();//輸出 hello zj

closure::bind — 複製乙個閉包,繫結指定的$this物件和類作用域。

closure::bindto — 複製當前閉包物件,繫結指定的$this物件和類作用域。

通過這兩個方法可以給類擴充套件複雜功能,類似策略模式,將實際操作與類定**耦。比如通過bing為使用者類增加行為:

class user

$sayhello = function()\n");

};$swimming = function() is swimming\n");

};$bindsayhello = closure::bind($sayhello, new user());

$bindswimming = closure::bind($swimming, new user());

$bindsayhello();

$bindswimming();

輸出: 

可以把類寫的更優雅點:

class user

public function doaction() }}

$sayhello = function()\n");

};$swimming = function() is swimming\n");

};$bindsayhello = closure::bind($sayhello, new user());

$bindsayhello();

$user = new user();

$user->addaction('sayhello', $sayhello);

$user->addaction('swimming', $swimming);

$user->doaction();

bindto方法與bind類似,只是通過閉包呼叫的,將自身繫結到物件或類上。

bind及bindto方法都有第三個引數,確定繫結的作用域。

發現乙個閉包實現中介軟體的例子,搬來作為補充學習:

--------------------- 以下內容來自『奔跑的碼農』,感謝。

<?php 

// 框架核心應用層};

// 前置校驗中介軟體

$auth = function($handler) need a auth middleware\n";

return $handler($name);

};};

// 前置過濾中介軟體

$filter = function($handler) need a filter middleware\n";

return $handler($name);

};};

// 後置日誌中介軟體

$log = function($handler) need a log middleware\n";

return $return;

};};

// 中介軟體棧

$stack = ;

// 打包

function pack_middleware($handler, $stack)

return $handler;}

// 註冊中介軟體

// 這裡用的都是全域性中介軟體,實際應用時還可以為指定路由註冊區域性中介軟體

$stack['log'] = $log;

$stack['filter'] = $filter;

$stack['auth'] = $auth;

輸出:

打包程式

中介軟體的執行順序是由打包函式(pack_middleware)決定,這裡返回的閉包實際上相當於:

編寫規範

中介軟體要要滿足一定的規範:總是返回乙個閉包,閉包中總是傳入相同的引數(由主要邏輯決定), 閉包總是返回控制代碼(handler)的執行結果;

如果中介軟體的邏輯在返回控制代碼return $handler($name)前完成,就是前置中介軟體,否則為後置中介軟體。

PHP中的閉包

在php中,由於存在函式內部不能訪問全域性作用的,所以就需要一種可以引入上一級作用域的語法結構,這種就是 閉包。語法 function use 例子 a 1 closure function use a closure 輸出為 1 這次就實現了閉包的功能了,可以和上級作用域產生了聯絡。學過js的到這...

php的閉包函式bingto php的閉包函式

toc 1 閉包 匿名 函式的意義 閉包 匿名 函式通常作為簡單函式功能的實現。閉包 匿名 函式可以 賦值給變數 或者 作為引數使用 閉包 匿名 函式是 函式程式設計 的基礎 2 閉包 匿名 函式的使用 2 1 匿名函式賦值給變數 greet function name printf hello s...

閉包 Python中的閉包

通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...