回调函数

回调函数就是在主进程执行当中,突然跳转到预先设置好的函数中去执行的函数.

  1. 以下是自知乎作者常溪玲的解说:
  2. 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。

以下是一个非常简单的回调函数的例子:

  1. <?php
  2. //登记回调函数
  3. function insert(int $i):bool {
  4. echo "插入数据{$i}\n";//模拟数据库插入//响应回调事件
  5. return true;
  6. }
  7. $arr = range(0,1000);//模拟生成1001条数据
  8. function action(array $arr, callable $function)
  9. {
  10. foreach ($arr as $value) {
  11. if ($value % 10 == 0) {//当满足条件时,去执行回调函数处理//触发回调
  12. call_user_func($function, $value);//调用回调事件
  13. }
  14. }
  15. }
  16. action($arr,'insert');

在这个例子中,首先定义了一个插入数据的函数,定义了一个1001条数据的数组
然后调用了action函数,当遍历数组满足条件时,则执行设定好的回调函数进行插入数据

回调函数的几种写法

函数字符串:

  1. <?php
  2. function insert(int $i):bool {
  3. echo "插入数据{$i}\n";//模拟数据库插入
  4. return true;
  5. }
  6. $arr = range(0,1000);//模拟生成1001条数据
  7. function action(array $arr, callable $function)
  8. {
  9. foreach ($arr as $value) {
  10. if ($value % 10 == 0) {//当满足条件时,去执行回调函数处理
  11. call_user_func($function, $value);
  12. }
  13. }
  14. }
  15. action($arr,'insert');

匿名函数

  1. <?php
  2. $arr = range(0,1000);//模拟生成1001条数据
  3. function action(array $arr, callable $function)
  4. {
  5. foreach ($arr as $value) {
  6. if ($value % 10 == 0) {//当满足条件时,去执行回调函数处理
  7. call_user_func($function, $value);
  8. }
  9. }
  10. }
  11. action($arr,function($i){
  12. echo "插入数据{$i}\n";//模拟数据库插入
  13. return true;
  14. });

类静态方法

  1. <?php
  2. $arr = range(0, 1000);//模拟生成1001条数据
  3. function action(array $arr, callable $function)
  4. {
  5. foreach ($arr as $value) {
  6. if ($value % 10 == 0) {//当满足条件时,去执行回调函数处理
  7. call_user_func($function, $value);
  8. }
  9. }
  10. }
  11. class A{
  12. static function insert(int $i):bool {
  13. echo "插入数据{$i}\n";//模拟数据库插入
  14. return true;
  15. }
  16. }
  17. action($arr,'A::insert');
  18. action($arr,array('A','insert'));

类方法

  1. <?php
  2. $arr = range(0, 1000);//模拟生成1001条数据
  3. function action(array $arr, callable $function)
  4. {
  5. foreach ($arr as $value) {
  6. if ($value % 10 == 0) {//当满足条件时,去执行回调函数处理
  7. call_user_func($function, $value);
  8. }
  9. }
  10. }
  11. class A{
  12. public function insert(int $i):bool {
  13. echo "插入数据{$i}\n";//模拟数据库插入
  14. return true;
  15. }
  16. }
  17. $a = new A();
  18. action($arr,array($a,'insert'));