Hello internals and a happy new year.
I've been meaning to ask this for some time now: why aren't closures
serializable? The only on-list discussion about this that i've found is:
http://marc.info/?l=php-internals&m=119837318407795&w=2
Personally i'd find serialization of closures very useful (think
serializing of callback arrays, serialization of objects that acquired
closure somewhere during execution, etc)
Also i find that being unable to serialize closure introduces a slight
inconsistency. It was possible to serialize "is callable" type (plain
array/string) whereas now it's not always the case[1] so programmers
have to be aware of it when using some kind of "register callback" behavior.
So to my question: why aren't closures serializable? Is it a design
choice or implementation issue?
I've looked at both zend_closure.c (for closure implementation) and
var.c (for serialization) but didn't see anything that could suggest
either way.
Now for some wild guessing: In the internals post mentioned above it's
stated that annonymous function name is along the lines of
hashfunction(__FILE__) and per_file_counter; i understand that it's
deterministic, and so if i were to serialize just this id (as sting) it
should be possible to track back to the actual code after
deserialization? i imagine that it would require (in simple terms)
getting the original file and "executing/assigning" n-th per_file
closure. It should be even simpler when done in the same request and/or
with opcode caches where just the id should be sufficient to get the
original opcodes and execute.
I'll look some more into it myself but i'm not that fluent in C to
provide quality patch (not to mention zend api). I'd like to know your
opinion whether this could be implemented though.
TIA
Marcin Kurzyna
[1] While it was possible to serialize an array of callbacks before it's
impossible with closures assigned, see example below:
http://aquarion.hq.crystalpoint.pl/public/php-internals/closure-serialization.php
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php