1<?php 2 3declare(strict_types=1); 4 5namespace GuzzleHttp\Psr7; 6 7use Psr\Http\Message\StreamInterface; 8 9/** 10 * Lazily reads or writes to a file that is opened only after an IO operation 11 * take place on the stream. 12 */ 13final class LazyOpenStream implements StreamInterface 14{ 15 use StreamDecoratorTrait; 16 17 /** @var string */ 18 private $filename; 19 20 /** @var string */ 21 private $mode; 22 23 /** 24 * @var StreamInterface 25 */ 26 private $stream; 27 28 /** 29 * @param string $filename File to lazily open 30 * @param string $mode fopen mode to use when opening the stream 31 */ 32 public function __construct(string $filename, string $mode) 33 { 34 $this->filename = $filename; 35 $this->mode = $mode; 36 37 // unsetting the property forces the first access to go through 38 // __get(). 39 unset($this->stream); 40 } 41 42 /** 43 * Creates the underlying stream lazily when required. 44 */ 45 protected function createStream(): StreamInterface 46 { 47 return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode)); 48 } 49} 50