PHP 回调闭包
回调函数,主进程执行时,跳转到预先设置好的函数去执行的函数
例子 商店没有你要的货,你留电话给店员,有货了,店员给你打电话,你到店里去取货,你的电话号码叫回调函数,把电话给店员叫登记回调函数,店里有货了叫你,触发回调关联事件
店员给你打电话叫调用回调函数,你到店里去取货叫响应回调事件
<?php
function insert(int $i):bool {//登记回调函数
echo "插入数据{$i}\n";//模拟数据库插入//响应回调事件
return true;
}
$arr = range(0,1000);//模拟生成1001条数据
function action(array $arr, callable $function){
foreach ($arr as $value) {
if ($value % 10 == 0) {//当满足条件时 去执行回调函数处理//触发回调
call_user_func($function, $value);//调用回调事件
}
}
}
action($arr,'insert');
先定义插入数据的函数 定义了 1001条数据的数组 后调用action函数 当遍历数组满足条件时 则执行设定的回调函数 插入数据
回调函数的写法
函数字符串法
<?php
function insert(int $i):bool {
echo "插入数据{$i}\n";//模拟数据库插入
return true;
}
$arr = range(0,1000);//模拟生成1001条数据
function action(array $arr, callable $function){
foreach ($arr as $value) {
if ($value % 10 == 0) {//当满足条件时,去执行回调函数处理
call_user_func($function, $value);
}
}
}
action($arr,'insert');
匿名函数法
<?php
$arr = range(0,1000);//模拟生成1001条数据
function action(array $arr, callable $function){
foreach ($arr as $value) {
if ($value % 10 == 0) {//当满足条件时,去执行回调函数处理
call_user_func($function, $value);
}
}
}
action($arr,function($i){
echo "插入数据{$i}\n";//模拟数据库插入
return true;
});
类静态方法法
<?php
$arr = range(0, 1000);//模拟生成1001条数据
function action(array $arr, callable $function){
foreach ($arr as $value) {
if ($value % 10 == 0) {//当满足条件时,去执行回调函数处理
call_user_func($function, $value);
}
}
}
class A{
static function insert(int $i):bool {
echo "插入数据{$i}\n";//模拟数据库插入
return true;
}
}
action($arr,'A::insert');
action($arr,array('A','insert'));
类方法
<?php
$arr = range(0, 1000);//模拟生成1001条数据
function action(array $arr, callable $function){
foreach ($arr as $value) {
if ($value % 10 == 0) {//当满足条件时,去执行回调函数处理
call_user_func($function, $value);
}
}
}
class A{
public function insert(int $i):bool {
echo "插入数据{$i}\n";//模拟数据库插入
return true;
}
}
$a = new A();
action($arr,array($a,'insert'));
闭包函数
闭包是能够读取其他函数内部变量的函数
闭包是函数和声明该函数的词法环境的组合
闭包是由函数及其相关引用环境组合而成的实体( 闭包=函数+引用环境 )
javascript中 只有函数内部的 子函数 才能读取 局部变量 所以闭包可以理解成 定义在一个函数内部的函数
本质上 闭包是将函数内部和函数外部连接起来的桥梁
php中 闭包函数一般就是匿名函数
定时任务 每一秒执行一次 现在 要开启一个服务 然后准备在30秒的时候关闭这个服务
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();
匿名函数 通俗来讲,就是没有名字的函数,
例如上面写的function(){},它通常作为闭包函数使用,使用方法如下:
<?php
$fun = function($name){
printf("Hello %s\r\n",$name);
};
echo $fun('Tioncico');
function a($callback){
return $callback();
}
a(function (){
echo "EasySwoole\n";
return 1;
});
USE关键字
PHP中默认 匿名函数不能调用所在代码块的上下文变量 需要通过使用use
<?php
function a($callback){
return $callback();
}
$str1 = "hello,";
$str2 = "Tioncico,";
a(function ()use($str1,$str2){
echo $str1,$str2,"EasySwoole\n";
return 1;
});
尊贵的董事大人
英文标题不为空时 视为本栏投稿
需要关键字 描述 英文标题