notes:

(1) Начиная с версии PHP 7.0 при указании строгой
    типизации declare(strict_types=1) имя временного файла
    нельзя передать используя возможности __toString(), т. к.
    функция или класс ожидают строку, а по факту мы передаём
    объект. В таком случае будет сгенерирована ошибка TypeError.
    Обойти это ограничение можно, если сразу передать имя временного
    файла через свойство объекта $tmpfile->filename.

(2) Класс new tmpfile не полностью заменяет функцию tmpfile(),
    т. к. при открытии потока fopen($tmpfile, 'w') временный файл
    не будет автоматически удалён. Решить эту проблему можно, если
    самостоятельно отследить не закрытый поток временного файла:

    foreach (get_resources('stream') as $resource) {
        stream_is_local($resource) or break;

        $meta = stream_get_meta_data($resource);

        if (@$meta['uri'] == $tmpfile->filename) {
            fclose($resource);
        }
    }

    Я не добавил этот код в метод $this->delete() в силу того, что
    удобнее сразу работать с tmpfile() для открытия потока, а класс
    new tmpfile предназначен всё таки для перемещения URI временного
    файла между объектами.
