[TOC]
# 閉包函數
******
閉包就是能夠讀取其他函數內部變量的函數。例如在 JavaScript 中,只有函數內部的子函數才能讀取局部變量,所以閉包可以理解成“定義在一個函數內部的函數”。在本質上,閉包是將函數內部和函數外部連接起來的橋梁。在 php 中,閉包函數一般就是匿名函數。舉例,有一個定時任務,每一秒執行一次,現在我們要開啟一個服務,然后準備在30秒的時候關閉這個服務。
```php
<?php
function tick($callback) {
while (1) { // 簡單實現的定時器,每秒都去執行一次回調。
call_user_func($callback);
sleep(1);
}
}
class Server
{
// 模擬退出一個服務
public function exitServer()
{
return true;
}
}
$server = new Server();
$time = time();
tick(function () use ($server) {
$server->exitServer();
});
```
在這里面,使用匿名函數,use 了函數外部的 $server 變量,才使得定時器能回調調用 $server->exitServer();
<br />
# 匿名函數
匿名函數,通俗來講,就是沒有名字的函數,例如上面寫的 function(){},它通常作為閉包函數使用,使用方法如下:
```php
<?php
$fun = function($name) {
printf("Hello %s\r\n", $name);
};
echo $fun('huanghui');
function a($callback) {
return $callback();
}
a(function () {
echo "EasySwoole\n";
return 1;
});
```
結果:
```php
Hello huanghui
EasySwoole
```
<br />
## use
PHP 在默認情況下,匿名函數不能直接調用所在代碼塊的上下文變量,而需要通過使用 use 關鍵字。
```php
<?php
function a($callback) {
return $callback();
}
$str1 = "hello,";
$str2 = "huanghui,";
a(function () use ($str1, $str2) {
echo $str1, $str2, "EasySwoole\n";
return 1;
});
```
結果:
```php
hello,huanghui,EasySwoole
```
- 引言
- Introduction
- 運行模式
- php-fpm
- php-cli
- 基礎介紹
- 網絡協議
- ip
- tcp
- tcp
- http
- webSocket
- udp
- port端口
- 會話管理
- cookie
- session
- api/token
- linux基礎
- lnmp安裝
- 命令
- 進程管理
- 擴展安裝
- 端口監控
- 防火墻說明
- php7.0
- 部分新特性
- php回調/閉包
- 回調事件
- 閉包/匿名函數
- php多進程
- 多進程開啟
- 進程通信
- 進程信號
- 僵尸進程
- 孤兒進程
- 守護進程
- 同步/異步
- 阻塞/非阻塞
- 協程
- Swoole
- 初始Swoole
- 運行機制
- 生命周期
- composer使用
- EasySwoole
- 設計理念
- 組件說明
- 運行過程
- demo
- 提問的藝術