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;
});

PHP 回调闭包和php use相关