В Go есть инструкция defer. Она откладывает выполнение операции на момент после возврата текущей функции:
func main() {
defer fmt.Println("world!")
fmt.Print("Hello ")
}
В PHP мы элементарно добьёмся того же эффекта, если присвоим переменной объект с требуемым кодом в деструкторе. После выполнения скрипта/функции/метода при высвобождении объекта из памяти PHP вызовет этот деструктор:
$defer = new class {
public function __destruct()
{
echo 'world!', PHP_EOL;
}
};
echo 'Hello ';
Каждый раз писать такую колбасу неудобно. Также может потребоваться запланировать несколько
defer. Поэтому мы берём на вооружение библиотечку php-defer/php-defer, которая
defer($_, static function (): void {
echo 'rld!', PHP_EOL;
});
defer($_, static function (): void {
echo ', wo';
});
echo 'Hello';
Главный вопрос: зачем это нужно, когда есть finally? Удобство
defer состоит в том, что его можно использовать в требуемом месте, не реорганизуя код. Прилагаю скриншот рефакторинга TyphoonReflectorMemoryTest — там всё очень наглядно. Кстати, этот тест я уже упоминал в посте Тест на циклические ссылки.Cпасибо @Danil42Russia за знакомство с php-defer.
В Laravel тоже есть такая функция, но её не получится использовать вне фреймфорка, спасибо @YourKey и @kafkianskiy.
