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

Reply via email to