协程:实现 Go 语言风格的 defer

由于Go语言没有提供析构方法,而PHP对象有析构函数,使用__destruct就可以实现Go的风格defer

实现代码

  1. class DeferTask
  2. {
  3. private $tasks;
  4. function add(callable $fn)
  5. {
  6. $this->tasks[] = $fn;
  7. }
  8. function __destruct()
  9. {
  10. //反转
  11. $tasks = array_reverse($this->tasks);
  12. foreach($tasks as $fn)
  13. {
  14. $fn();
  15. }
  16. }
  17. }
  • 基于PHP对象析构方法实现的defer更灵活,如果希望改变执行的时机,甚至可以将DeferTask对象赋值给其他生命周期更长的变量,defer任务的执行可以延长生命周期
  • 默认情况下与Godefer完全一致,在函数退出时自动执行

使用实例

  1. function test() {
  2. $o = new DeferTask();
  3. //逻辑代码
  4. $o->add(function () {
  5. //code 1
  6. });
  7. $o->add(function () {
  8. //code 2
  9. });
  10. //函数结束时,对象自动析构,defer 任务自动执行
  11. return $retval;
  12. }