<?php
interface TemporaryFile {
public function handle(\Closure $closure) : void;
public function write(string $contents): void;
public function getContents() : string;
public function chmod(int $mode): void;
public function getUri() : string; // aka realpath
public function close() : void;
}
class IO
{
/**
* @return TemporaryFile
*/
public static function getTemporaryFile() : TemporaryFile {
return new class implements TemporaryFile {
private $handle;
public function __construct()
{
$this->handle = tmpfile();
}
public function handle(\Closure $closure) : void {
$closure($this->handle);
}
public function getContents() : string {
// according to PHP docs file_get_contents has much better performance
// http://php.net/manual/en/function.fread.php
return file_get_contents($this->getUri());
}
public function getUri() : string {
return stream_get_meta_data($this->handle)['uri'];
}
public function close() : void {
if (is_resource($this->handle))
fclose($this->handle);
}
public function write(string $contents): void
{
fwrite($this->handle, $contents);
}
public function chmod(int $mode): void
{
chmod($this->getUri(), $mode);
}
public function __destruct() {
$this->close();
}
};
}
}
$file = IO::getTemporaryFile();
$file->write('foo');
var_dump($file->getContents());
Fatal error: Uncaught TypeError: Return value of class@anonymous::write() must be an instance of void, none returned in /in/LYfan:48
Stack trace:
#0 /in/LYfan(63): class@anonymous->write('foo')
#1 {main}
thrown in /in/LYfan on line 48
Process exited with code 255.
Parse error: syntax error, unexpected ':', expecting ';' or '{' in /in/LYfan on line 4
Process exited with code 255.
Output for 5.1.0 - 5.1.6, 5.2.0 - 5.2.17
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /in/LYfan on line 4
Parse error: syntax error, unexpected ':', expecting ';' or '{' in /in/LYfan on line 4
Process exited with code 255.
Output for 5.0.0 - 5.0.5
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /in/LYfan on line 4
Parse error: parse error, unexpected ':', expecting '{' or ';' in /in/LYfan on line 4
Process exited with code 255.
Output for 4.4.2 - 4.4.9
Parse error: syntax error, unexpected T_STRING in /in/LYfan on line 3
Process exited with code 255.