由于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;
}