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 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.4, 8.3.6 - 8.3.7
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" }
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 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" }
Output for 7.1.25 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30
---------- [ 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" }

preferences:
166.21 ms | 404 KiB | 184 Q