在过去的六周内,我举办了一次关于ZendFramework2开发模式的网络研讨会和教程。我探索的第一个模式是我们的自动加载器新套件,它的目标是性能和快速应用程序开发——后者一直是正确的,因为我们遵循了PEAR标准,但前者在1.X系列中一直难以捉摸.
有趣的是,很多人问我他们是否可以在他们的ZendFramework1开发中使用新的自动加载器。简短的回答是“是”,假设您已经在运行PHP5.3。然而,如果不是,直到今天,答案都是“否”。
我最近将ZF2自动加载器反向移植到PHP5.2,并将它们发布在GitHub上:
- https://github.com/weierophinney/zf-examples/tree/feature%2Fzf1-classmap/zf1-classmap
我也在这里发布一个压缩包:
- https://uploads.mwop.net/zf1-classmap.tgz
功能包括:
- 类映射生成工具
- 符合PSR-0的自动加载器,具有
include_path
后备功能 - 类映射自动加载器
- 一次加载多个自动加载策略的自动加载器工厂
我包含了一个README文件,其中详细介绍了大多数用例:
- https://github.com/weierophinney/zf-examples/blob/feature%2Fzf1-classmap/zf1-classmap/README.md
我发现,最有趣的用例是将类映射自动加载器与配置有一个或多个路径并设置为后备的PSR-0自动加载器相结合。这允许在类映射播种良好时提高性能,并在积极开发时提高开发人员性能。为了让它工作,您至少需要创建一个空的类映射。我将在生成项目后立即执行以下操作以预先播种它:
$ cd application/ $ php /path/to/zf/bin/classmap_generator.php -w Creating class file map for library in '/var/www/project/application'... Wrote classmap file to '/var/www/project/application/.classmap.php' $ cd ../library/ $ php /path/to/zf/bin/classmap_generator.php -w Creating class file map for library in '/var/www/project/library'... Wrote classmap file to '/var/www/project/library/.classmap.php'
(-w
开关告诉生成器覆盖任何已经存在的类映射文件。)
从那里开始,我在public/index.php
中执行以下操作:
require_once __DIR__ . '/../library/ZendX/Loader/AutoloaderFactory.php'; ZendX_Loader_AutoloaderFactory::factory(array( 'ZendX_Loader_ClassMapAutoloader' => array( __DIR__ . '/../library/.classmap.php', __DIR__ . '/../application/.classmap.php', ), 'ZendX_Loader_StandardAutoloader' => array( 'prefixes' => array( 'My' => __DIR__ . '/../library/My', ), 'fallback_autoloader' => true, ), ));
以上示例执行以下操作:
- 从我项目的每个
application/
和library
目录中可用的类创建类映射。 - 实例化一个类-从这些类映射映射自动加载器,并将它们注册到SPL自动加载器。
- 创建一个
StandardAutoloader
实例,该实例知道My
vendorprefix,指向My/
我库中的子目录;当我在此处添加类文件时,它们会自动被发现。 - 设置一个可识别我的
include_path
的后备自动加载器。
创建此设置需要一分钟左右的时间,但可确保我立即提高工作效率。然后,我通过在我的应用程序和库目录上重新运行classmap_generator.php
脚本并在版本控制下检查它来定期更新我的类映射。
这个库是开始提升ZF1应用程序性能的绝佳方式(特别是如果您剥离require_once
调用),同时开始使您的代码与ZF2向前兼容。
更新
-
2011-05-1111:00CDT:更新了存储库中的
classmap_generator.php
以删除闭包,从而使其成为真正的PHP5.2合规。此外,使用此更改更新了zf1-classmap.tgz
tarball。 -
2011-05-1116:00CDT:更新
ClassFileLocator
以在早期PHP版本中定义特定于PHP5.3的分词器常量。 -
2011-05-2310:25CDT:将
generate_classmap.php
更新为(a)在路径中使用DIRECTORY_SEPARATOR
以确保从Windows到*nix环境的可移植性,以及(b)缓存结果dirname(__FILE__)
以提高性能。感谢TomasFejfar报告这些问题。