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