Zend Framework 2中的工厂类与闭包

gle*_*-84 8 factory php-closures zend-framework2

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

我知道闭包不能被序列化,但如果你从Module#getServiceConfig()返回它们,这不会影响其余配置数据的缓存,并且闭包将被缓存在你的操作码缓存中.

在构建工厂类与执行闭包时,性能有何不同?PHP是否仅在执行时包装和实例化闭包,或者它是否会在每个请求中为配置文件中定义的每个闭包执行此操作?

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

也可以看看:

Tom*_*ess 11

PHP会在编译时将配置中的匿名函数转换为闭包类的实例,因此它会在每个请求中执行此操作.这与create_function在运行时创建函数不同.但是,由于闭包在编译时执行此操作,因此它应该在您的opcache缓存中,因此无关紧要.

首先,您必须记住,每次请求都只构建一次服 我运行了一个使用闭包和工厂获取服务的快速基准测试,这就是我得到的(我跑了几次,所有结果都是相同的值):

Closure: 0.026999999999999ns
Factory: 0.30200000000002ns
Run Code Online (Sandbox Code Playgroud)

那些是纳秒,即10 -9秒.基本上,性能差异很小,没有有效的差异.

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

但是,我更喜欢工厂,主要是可读性和可维护性.对于工厂,你不会得到一些庞大的配置文件,其中包含大量的闭包.

当然,关闭对于快速开发很有帮助,但如果你希望你的代码可读和可维护,那么我会说坚持工厂.

  • 关于缓存的事情:所有带闭包的东西都应该放在Module-Class的`getXyzConfig()`里面.只有`module.config.php`;中的非闭包配置 (2认同)
  • 更不用说闭包都是在每个请求上创建的,但工厂类只有在实际需要它们后面的服务时才会被实例化. (2认同)