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

最后更新于:2022-04-02 06:16:33

# 协程:实现 Go 语言风格的 defer [TOC] 由于`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`任务的执行可以延长生命周期 * 默认情况下与`Go`的`defer`完全一致,在函数退出时自动执行 ## 使用实例 ~~~ function test() { $o = new DeferTask(); //逻辑代码 $o->add(function () { //code 1 }); $o->add(function () { //code 2 }); //函数结束时,对象自动析构,defer 任务自动执行 return $retval; } ~~~
';