3v4l.org

run code in 300+ PHP versions simultaneously
<?php ini_set('error_reporting', '-1'); ini_set('display_errors', '1'); class SerializableClass implements \Serializable { private $foo = 'bar'; public function serialize() { return serialize([$this->foo]); } public function unserialize($serialized) { list($this->foo) = unserialize($serialized); } } class SleepableClass { private $foo = 'bar'; public function __sleep() { return ['foo']; } } function safelyUnserialize($file) { $e = null; $meta = false; // $content = file_get_contents($file); $content = $file; $signalingException = new \UnexpectedValueException(); $prevUnserializeHandler = ini_set('unserialize_callback_func', ''); $prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$prevErrorHandler, $signalingException) { if (__FILE__ === $file) { throw $signalingException; } return $prevErrorHandler ? $prevErrorHandler($type, $msg, $file, $line, $context) : false; }); try { $meta = unserialize($content); } catch (\Throwable $e) { if ($e !== $signalingException) { throw $e; } } finally { restore_error_handler(); ini_set('unserialize_callback_func', $prevUnserializeHandler); } return $meta; } echo "\n---------- [ Serializable ] ----------\n\n"; $serializableObject = new SerializableClass(); $serializableValidPayload = serialize($serializableObject); $serializableInvalidPayload = str_replace('"SerializableClass"', '"SerializableClazz"', $serializableValidPayload); echo "\n----- Invalid payload:\n\n"; var_dump($serializableInvalidPayload); echo "\n----- unserialize()\n\n"; var_dump(unserialize($serializableInvalidPayload)); echo "\n----- safelyUnserialize()\n\n"; var_dump(safelyUnserialize($serializableInvalidPayload)); echo "\n---------- [ Sleep / Wakeup ] ----------\n\n"; $sleepableObject = new SleepableClass(); $sleepableValidPayload = serialize($sleepableObject); $sleepableInvalidPayload = str_replace('"SleepableClass"', '"SleepableClazz"', $sleepableValidPayload); echo "\n----- Invalid payload:\n\n"; var_dump($sleepableInvalidPayload); echo "\n----- unserialize()\n\n"; var_dump(unserialize($sleepableInvalidPayload)); echo "\n----- safelyUnserialize()\n\n"; var_dump(safelyUnserialize($sleepableInvalidPayload));
Output for git.master, git.master_jit, rfc.property-hooks
Deprecated: SerializableClass implements the Serializable interface, which is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in /in/0Chn9 on line 6 ---------- [ Serializable ] ---------- ----- Invalid payload: string(50) "C:17:"SerializableClazz":20:{a:1:{i:0;s:3:"bar";}}" ----- unserialize() Warning: Class __PHP_Incomplete_Class has no unserializer in /in/0Chn9 on line 73 object(__PHP_Incomplete_Class)#2 (1) { ["__PHP_Incomplete_Class_Name"]=> string(17) "SerializableClazz" } ----- safelyUnserialize() bool(false) ---------- [ Sleep / Wakeup ] ---------- ----- Invalid payload: string(63) "O:14:"SleepableClazz":1:{s:19:"SleepableClassfoo";s:3:"bar";}" ----- unserialize() object(__PHP_Incomplete_Class)#3 (2) { ["__PHP_Incomplete_Class_Name"]=> string(14) "SleepableClazz" ["foo":"SleepableClass":private]=> string(3) "bar" } ----- safelyUnserialize() object(__PHP_Incomplete_Class)#5 (2) { ["__PHP_Incomplete_Class_Name"]=> string(14) "SleepableClazz" ["foo":"SleepableClass":private]=> string(3) "bar" }

This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.

Active branches

Archived branches

Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page


preferences:
33.75 ms | 409 KiB | 5 Q