3v4l.org

run code in 200+ php & hhvm versions
Bugs & Features
<?php class StringStreamWrapper { const PROTOCOL = "stringstream"; private $stringstream; private $position; private $stringlength; public function stream_open($path, $mode, $options, &$opened_path) { $contextOptions = stream_context_get_options($this->context); if (!isset($contextOptions[self::PROTOCOL]['string'])) return false; $this->position = 0; // this is our stream! $this->stringstream = $contextOptions[self::PROTOCOL]['string']; $this->stringlength = strlen($this->stringstream); return true; } public function stream_read($len) { $data = substr($this->stringstream, $this->position, $len); $this->position += strlen($data); return $data; } public function stream_write($data){ $l = strlen($data); $this->stringstream = substr($this->stringstream, 0, $this->position) . $data . substr($this->stringstream, $this->position += $l); $this->stringlength = strlen($this->stringstream); return $l; } public function stream_seek($offset, $whence = SEEK_SET) { if ($whence == SEEK_CUR) { $this->position += $offset; } else if ($whence == SEEK_END) { $this->position = $this->stringlength + $offset; } else { $this->position = $offset; } return true; } public function stream_tell() { return $this->position; } public function stream_eof() { return ($this->position >= $this->stringlength); } public function stream_stat() { return array( 7 => $this->stringlength, 'size' => $this->stringlength, ); } static public function Open($string) { $context = stream_context_create(array(self::PROTOCOL => array('string' => &$string))); return fopen(self::PROTOCOL . "://",'r', false, $context); } } stream_wrapper_register(StringStreamWrapper::PROTOCOL, "StringStreamWrapper"); class replace_nullchar_filter extends php_user_filter { function filter($in, $out, &$consumed, $closing) { while ($bucket = stream_bucket_make_writeable($in)) { $bucket->data = str_replace("\0", "", $bucket->data); $consumed += $bucket->datalen; stream_bucket_append($out, $bucket); } return PSFS_PASS_ON; } } stream_filter_register('replacenullchar', 'replace_nullchar_filter'); class StringStreamWrapperFixed { public static function bug68532fixed() { if (defined('BUG68532FIXED')) return BUG68532FIXED; return version_compare(PHP_VERSION, '5.6.5', '>=') || (version_compare(PHP_VERSION, '5.5.21', '>=') && version_compare(PHP_VERSION, '5.6.0', '<')); } public static function Open($string) { ZLog::Write(LOGLEVEL_DEBUG, "StringStreamWrapper::Open(): len = ".strlen($string)); if (self::bug68532fixed()) { $stream = fopen('php://temp', 'r+'); } else { $stream = tmpfile(); } fwrite($stream, $string); rewind($stream); return $stream; } } ####################################### $testString = 'test'; echo "base64_encode = " . base64_encode($testString).PHP_EOL; ####################################### $stream = fopen('php://memory','r+'); fwrite($stream, $testString); rewind($stream); stream_filter_append($stream, 'convert.base64-encode'); echo "memoryStream 1 = " . stream_get_contents($stream).PHP_EOL; ####################################### $stream = fopen('php://memory','r+'); fwrite($stream, $testString); rewind($stream); stream_filter_append($stream, 'replacenullchar'); stream_filter_append($stream, 'convert.base64-encode'); echo "memoryStream 2 = " . stream_get_contents($stream).PHP_EOL; ####################################### $stream = StringStreamWrapper::Open($testString); stream_filter_append($stream, 'convert.base64-encode'); echo "StringStreamWrapper 1 = " . stream_get_contents($stream).PHP_EOL; ####################################### $stream = StringStreamWrapper::Open($testString); stream_filter_append($stream, 'replacenullchar'); stream_filter_append($stream, 'convert.base64-encode'); echo "StringStreamWrapper 2 = " . stream_get_contents($stream).PHP_EOL; ####################################### $stream = StringStreamWrapperFixed::Open($testString); stream_filter_append($stream, 'convert.base64-encode'); echo "StringStreamWrapperFixed 1 = " . stream_get_contents($stream).PHP_EOL; ####################################### $stream = StringStreamWrapperFixed::Open($testString); stream_filter_append($stream, 'replacenullchar'); stream_filter_append($stream, 'convert.base64-encode'); echo "StringStreamWrapperFixed 2 = " . stream_get_contents($stream).PHP_EOL;
based on 0W3jg
Output for 7.0.0 - 7.2.0
base64_encode = dGVzdA== memoryStream 1 = dGVzdA== memoryStream 2 = dGVzdA== StringStreamWrapper 1 = dGVz StringStreamWrapper 2 = dGVz Fatal error: Uncaught Error: Class 'ZLog' not found in /in/bkHmm:95 Stack trace: #0 /in/bkHmm(140): StringStreamWrapperFixed::Open('test') #1 {main} thrown in /in/bkHmm on line 95
Process exited with code 255.
Output for 5.5.21 - 5.5.38, 5.6.5 - 5.6.25
base64_encode = dGVzdA== memoryStream 1 = dGVzdA== memoryStream 2 = dGVzdA== StringStreamWrapper 1 = dGVz StringStreamWrapper 2 = dGVz Fatal error: Class 'ZLog' not found in /in/bkHmm on line 95
Process exited with code 255.
Output for 5.5.0 - 5.5.20, 5.6.0 - 5.6.4
base64_encode = dGVzdA== memoryStream 1 = dGVz memoryStream 2 = dGVz StringStreamWrapper 1 = dGVz StringStreamWrapper 2 = dGVz Fatal error: Class 'ZLog' not found in /in/bkHmm on line 95
Process exited with code 255.