php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #63021 var_export() does not export Closures
Submitted: 2012-09-06 10:36 UTC Modified: 2012-09-06 11:45 UTC
Votes:11
Avg. Score:4.5 ± 0.8
Reproduced:10 of 10 (100.0%)
Same Version:2 (20.0%)
Same OS:1 (10.0%)
From: dexen dot devries at gmail dot com Assigned:
Status: Open Package: *Programming Data Structures
PHP Version: 5.4.6 OS:
Private report: No CVE-ID: None
 [2012-09-06 10:36 UTC] dexen dot devries at gmail dot com
Description:
------------
While var_dump() produces sensible output for Closures, output of the var_export() is pretty much useless.

Test script:
---------------
<?php

$a = range(1, 3);
$foo = function($n) use($a) {
	return $a[$n];
};

var_dump($foo);
var_export($foo);


Expected result:
----------------
object(Closure)#1 (2) {
  ["static"]=>
  array(1) {
    ["a"]=>
    array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
    }
  }
  ["parameter"]=>
  array(1) {
    ["$n"]=>
    string(10) "<required>"
  }
}

(((resembling the following:)))
object(Closure)#1 (2) {
  ["static"]=>
  array(1) {
    ["a"]=>
    array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
    }
  }
  ["parameter"]=>
  array(1) {
    ["$n"]=>
    string(10) "<required>"
  }
}

Actual result:
--------------
object(Closure)#1 (2) {
  ["static"]=>
  array(1) {
    ["a"]=>
    array(3) {
      [0]=>
      int(1)
      [1]=>
      int(2)
      [2]=>
      int(3)
    }
  }
  ["parameter"]=>
  array(1) {
    ["$n"]=>
    string(10) "<required>"
  }
}
Closure::__set_state(array(
))

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2012-09-06 11:45 UTC] laruence@php.net
-Type: Bug +Type: Feature/Change Request
 [2012-09-06 11:45 UTC] laruence@php.net
closure can not be serialized.. change to feature request instead.
 [2014-03-17 15:15 UTC] benjamin dot morel at strictcoding dot co dot uk
This would be great. Could the parameter list and PHP code defined in the closure be passed to __set_state()? Something like:

function ($a, $b) { return 'hi'; }

__set_state(array(
    'parameters' => array(
        'a' => array( ... )
        'b' => array( ... )
    ),
    'code' => 'return \'hi\';'
));

It might be tricky to export the use()d variables, though.
 [2019-04-09 10:16 UTC] benjamin dot morel at gmail dot com
For anyone interested, I just released a userland implementation of var_export() that supports exporting closures:

https://github.com/brick/varexporter

It's based on nikic's PHP-Parser library, and works pretty well, with a few caveats!
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Wed Dec 04 08:01:29 2024 UTC