Skip to content
This repository has been archived by the owner on Sep 1, 2020. It is now read-only.

Latest commit

 

History

History
47 lines (41 loc) · 978 Bytes

1.3.15 - 协程:实现 Go 语言风格的 defer.md

File metadata and controls

47 lines (41 loc) · 978 Bytes

协程:实现 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;
}