Честно говоря, я думаю, что вы пытаетесь решить не ту проблему. Если вы спите в классе, разве не плохо спать, если вы не можете все сериализовать? В противном случае вы можете проснуться в несовместимое состояние (или, по крайней мере, в состояние, отличное от текущего). Поэтому я бы сказал, что вы должны просто поместить все в результирующий массив, а затем позволить PHP сообщить вам, если он не сериализуем.
В противном случае, нужно ли проверять, являются ли сохраненные объекты сериализуемыми? Должны ли вы тогда проверять наличие Serializable
интерфейса или наличие __sleep
? Где вы проводите черту? Поэтому я бы сказал, что вам не следует сериализовать ресурсы и переменные, которые вы явно знаете, как воссоздать в функции пробуждения (например, соединение с базой данных или любые замыкания, которые вы явно знаете, как воссоздать). Но будьте осторожны, поскольку, если вы позволите этим закрытиям / ресурсам изменяться через API объекта, как вы можете быть уверены в успешном пробуждении к предыдущему состоянию.
Короче, я бы порекомендовал просто вернуть все и позволить PHP обрабатывать несериализуемые переменные. В противном случае вам понадобится либо белый список (который не будет практичным), либо черный список (который не будет полным). И ни один не является отличным решением. Просто обработайте исключение, когда оно наступит (бросать и ловить исключения - это неплохо).
Что касается вашего точного вопроса, я бы реализовал его следующим образом:
function is_closure($callback) {
$func = function(){};
return $callback instanceof $func;
}
Он по-прежнему опирается на детали реализации замыкания типа Object, но я думаю, что это лучшее, что мы можем сделать на данный момент. Лучшим решением было бы обратиться к ядру с просьбой добавить функцию is_closure()
, которая не зависела бы от реализации ...