The latest, and last, release of the Zend Framework 1.x series is just around the corner as ZF 1.12.0RC1 was announced this week. As I still have projects running ZF1 I thought about giving the most interesting new feature (for me) a spin - the new autoloaders which are backported from ZF2.
Note: the code below was updated to work with ZF 1.12.0RC2. Should still work with RC1, too.
I decided using the classmap autoloader as the main autoloader, and the good ol' standard autoloader as the fallback autoloader. For the classmap autoloader to work we need to create a classmap. ZF1.12 comes with a tool, located in the bin directory, called classmap_generator.php , which will generate the classmap for us:
- $ cd /path/to/project/library
- $ php /path/to/zf1.12/bin/classmap_generator.php
This will generate a PHP file called autoload_classmap.php in the library directory and it will have classname - filename mappings of the classes/files from that directory.
Next, need to change the index.php a bit to tell ZF to use the new autoloaders:
-
-
- set_include_path(implode(PATH_SEPARATOR, array(
- realpath(APPLICATION_PATH . '/../library'),
- get_include_path(),
- )));
- require_once '../library/Zend/Loader/AutoloaderFactory.php';
-
-
-
- require_once '../library/Zend/Loader/ClassMapAutoloader.php';
- Zend_Loader_AutoloaderFactory::factory(
- array(
- 'Zend_Loader_ClassMapAutoloader' => array(
- __DIR__ . '/../library/autoload_classmap.php',
- __DIR__ . '/../application/autoload_classmap.php'
- ),
- 'Zend_Loader_StandardAutoloader' => array(
- 'prefixes' => array(
- 'Zend' => __DIR__ . '/../library/Zend'
- ),
- 'fallback_autoloader' => true
- )
- )
- );
-
and that's about it - the autoloader will load classes from the classmaps, but if it fails to do so, it will fall back to the standard autoloader.
Stripping out require_once calls
The Zend Framework manual has a section on how to improve performance of the framework itself, and one of the suggestion is to strip out the require_once calls from the library. I had to alter that find/sed command combination a bit in order to make it work with the classmaps:
- $ find . -name '*.php' \
- -not -wholename '*/Application.php' \
- -not -wholename '*/Loader*' \
- -print0 | xargs -0 \
- sed --regexp-extended \
- --in-place 's/(require_once)/\/\/ \1/g'
If I'm not wrong in reading my "debugging" echo statements, the standard autoloader gets called only once - to load the classmap autoloader itself - everything else is loaded via the classmaps. Pretty cool.
Happy hackin'!
|