если я serialize($obj)
, я получаю:
Сериализация «Закрытие» не допускается
Можно ли игнорировать эти замыкания при сериализации? Я не нуждаюсь в них, когда я все равно не инициализую строку (значение этих свойств может быть нулевым или каким-либо другим).
Мой класс выглядит так:
Class Node{ protected $attrs = array(); }
$attrs
– ассоциативный массив, который может содержать некоторые элементы, которые являются замыканиями, например $attrs['validator'] = function(){...}
Я написал функцию, которая позволяет сериализовать любое Exception
. Это делается путем сглаживания сложных значений в обратном направлении.
https://gist.github.com/Thinkscape/805ba8b91cdce6bcaf7c
<?php try { // exception gets thrown here, ie // throw new Exception(); } catch (Exception $exception) { flattenExceptionBacktrace($exception); $serialized = serialize($exception); $unserialized = unserialize($serialized); print_r($unserialized->getTraceAsString()); }
Это просто: вы не можете. Закрытие не является сериализуемым. Если вы хотите создать «нечто похожее», вы можете использовать объекты класса, реализующие __invoke()
вместо закрытия.
Если вам не нужны блокировки (или вы можете их воссоздать самостоятельно, а неэтериализовать), вы можете реализовать Serializable
и не принимать во внимание во время сериализации. Этот интерфейс (реализация serialize()
и unserialize()
) должен быть предпочтительнее __sleep()
/ __wakeup()
.
обеспечить собственную реализацию методов sleep () и _wakeup