length = mb_strlen($data, '8bit'); $resource = fopen('php://memory', 'rb+'); fwrite($resource, $data); rewind($resource); $this->data = $resource; } public function read(int $length): string { if (0 === $length) { return ''; } $read = fread($this->data, $length); $bytesRead = mb_strlen($read, '8bit'); Assertion::length($read, $length, sprintf('Out of range. Expected: %d, read: %d.', $length, $bytesRead), null, '8bit'); $this->totalRead += $bytesRead; return $read; } public function close(): void { fclose($this->data); } public function isEOF(): bool { return $this->totalRead === $this->length; } }