Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:42452 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 42440 invoked from network); 2 Jan 2009 19:56:52 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 2 Jan 2009 19:56:52 -0000 X-Host-Fingerprint: 83.6.244.56 abdc56.neoplus.adsl.tpnet.pl Received: from [83.6.244.56] ([83.6.244.56:23694] helo=localhost.localdomain) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 87/E1-28540-1817E594 for ; Fri, 02 Jan 2009 14:56:51 -0500 Message-ID: <87.E1.28540.1817E594@pb1.pair.com> To: internals@lists.php.net Date: Fri, 02 Jan 2009 20:56:41 +0100 User-Agent: Thunderbird 2.0.0.18 (Windows/20081105) MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-2; format=flowed Content-Transfer-Encoding: 7bit X-Posted-By: 83.6.244.56 Subject: Closures serialization From: m.kurzyna@crystalpoint.pl (Marcin Kurzyna) 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