× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

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

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

实现代码

class DeferTask
{
    private $tasks;

    function add(callable $fn)
    {
        $this->tasks[] = $fn;
    }

    function __destruct()
    {
        //反转
        $tasks = array_reverse($this->tasks);
        foreach($tasks as $fn)
        {
            $fn();
        }
    }
}
  • 基于PHP对象析构方法实现的defer更灵活,如果希望改变执行的时机,甚至可以将DeferTask对象赋值给其他生命周期更长的变量,defer任务的执行可以延长生命周期
  • 默认情况下与Godefer完全一致,在函数退出时自动执行

使用实例

function test() {
    $o = new DeferTask();
    //逻辑代码
    $o->add(function () {
        //code 1
    });
    $o->add(function () {
        //code 2
    });
    //函数结束时,对象自动析构,defer 任务自动执行
    return $retval;
}