Zend framework2 Zend Framework 2中的工厂类与闭包

Zend framework2 Zend Framework 2中的工厂类与闭包,zend-framework2,factory,php-closures,Zend Framework2,Factory,Php Closures,在Zend Framework 2中使用工厂类或闭包更好吗?为什么 我知道闭包无法序列化,但如果您从模块#getServiceConfig()返回闭包,这不会影响其余配置数据的缓存,并且闭包将缓存在操作码缓存中 构造工厂类和执行闭包的性能有什么不同?PHP是否仅在执行闭包时包装和实例化闭包,还是会在每次请求时为配置文件中定义的每个闭包包装和实例化闭包 有人比较过每种方法的执行时间吗 另见: PHP将在编译时将配置中的匿名函数转换为closure类的实例,以便在每次请求时都这样做。这与将在运

在Zend Framework 2中使用工厂类或闭包更好吗?为什么

我知道闭包无法序列化,但如果您从模块#getServiceConfig()返回闭包,这不会影响其余配置数据的缓存,并且闭包将缓存在操作码缓存中

构造工厂类和执行闭包的性能有什么不同?PHP是否仅在执行闭包时包装和实例化闭包,还是会在每次请求时为配置文件中定义的每个闭包包装和实例化闭包

有人比较过每种方法的执行时间吗

另见:


PHP将在编译时将配置中的匿名函数转换为closure类的实例,以便在每次请求时都这样做。这与将在运行时创建函数的
create\u函数不同。然而,由于闭包在编译时执行此操作,所以它应该在您的opcache缓存中,因此并不重要

关于使用工厂与闭包构造服务对性能的影响,首先您必须记住,无论您请求服务多少次,每个请求只构造一次服务。我使用一个闭包和一个工厂运行了一个获取服务的快速基准测试,下面是我得到的结果(我运行了几次,所有结果都是相同的值):

这些是纳秒,即10-9秒。基本上,性能差异非常小,没有有效的差异

此外,ZF2无法使用闭包缓存整个模块的配置。如果我使用纯工厂,那么我的整个配置可以合并、缓存,并且可以在每次请求时读取一个简单的文件,而不必担心每次加载和合并配置文件。我还没有衡量这对性能的影响,但我猜这在任何情况下都是微不足道的

然而,我更喜欢工厂,主要是为了可读性和可维护性。对于工厂,你不会得到一个到处都是大量闭包的大型配置文件


当然,闭包对于快速开发非常有用,但是如果您希望代码可读性和可维护性,那么我建议您坚持使用工厂。

关于缓存的事情:使用闭包的所有内容都应该放在模块类的
getXyzConfig()
中。只有module.config.php中的非闭包配置更不用说闭包都是在每个请求上创建的,但是工厂类只有在实际需要它们背后的服务时才会被实例化;我迟来的一点是,您还可以为类似的服务创建工厂基类,它允许您通过继承重用现有工厂代码。另一个优点是“可读性和可维护性”。
Closure: 0.026999999999999ns
Factory: 0.30200000000002ns