Home >Backend Development >PHP Tutorial >zend-framework - php如何序列化/存储闭包(Closure)

zend-framework - php如何序列化/存储闭包(Closure)

WBOY
WBOYOriginal
2016-06-06 20:51:581208browse

在最新的Zend Framework 2.0中,已经开始大量采用php5.3的闭包特性。可以通过在配置文件中引入闭包来初始化模块。(参看:http://packages.zendframework.com/doc...)

但是配置文件会存在缓存,格式转换等需求(php => xml),此时对于配置文件内的闭包应该如何处理? 直接序列化闭包php并不支持。

回复内容:

在最新的Zend Framework 2.0中,已经开始大量采用php5.3的闭包特性。可以通过在配置文件中引入闭包来初始化模块。(参看:http://packages.zendframework.com/doc...)

但是配置文件会存在缓存,格式转换等需求(php => xml),此时对于配置文件内的闭包应该如何处理? 直接序列化闭包php并不支持。

没用过Zend,不过我想ZF2只不过是简单的把闭包函数的代码复制到不同格式的配置文件里,最后肯定都是要重新写回到PHP代码格式的缓存(可以直接运行),不然运行时去解析配置文件,效率太差。

实在需要序列化,可以用反射(Reflection),并直接操作代码文件获得上下文信息:

/**
 * 创建一个反射:
 */
$reflection = new ReflectionFunction($closure);

/**
 * 参数可以直接得到了:
 */
$params = $reflection->getParameters();

/**
 * 获得Closure的函数体和use变量,形如:
 * function($arg1, $arg2, ...) use ($val1, $val2, ...) {
 *     // 要获得这个部分的代码!
 * }
 * 办法很多,你可以直接用正则、字符串查找或者Tokenizer,等等等等。
 * 比如可以先从reflection里得到函数的开始行和结束行:
 */
$startLine = $reflection->getStartLine();
$endLine = $reflection->getEndLine();
// 然后用str*这个,str*那个的函数来清理,细节不写了:
$usedVars = use变量们;
$closureBody = 函数体;

// ...

至此params,usedVars,closureBody等等只是数组和字符串了。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn