Most Zend_View "methods" are actually provided via
overloading to the helper system. This provides important flexibility to
Zend_View; instead of needing to extend
Zend_View and provide all the helper methods you may
utilize in your application, you can define your helper methods in separate
classes and consume them at will as if they were direct methods of
Zend_View. This keeps the view object itself relatively
thin, and ensures that objects are created only when needed.
Internally, Zend_View uses the PluginLoader to look
up helper classes. This means that for each helper you call,
Zend_View needs to pass the helper name to the
PluginLoader, which then needs to determine the class name, load the
class file if necessary, and then return the class name so it may be
instantiated. Subsequent uses of the helper are much faster, as
Zend_View keeps an internal registry of loaded helpers,
but if you use many helpers, the calls add up.
The question, then, is: how can you speed up helper resolution?
The simplest, cheapest solution is the same as for general PluginLoader performance: use the PluginLoader include file cache. Anecdotal evidence has shown this technique to provide a 25-30% performance gain on systems without an opcode cache, and a 40-65% gain on systems with an opcode cache.
Another solution for those seeking to tune performance even
further is to extend Zend_View to manually add the
helper methods they most use in their application. Such helper
methods may simply manually instantiate the appropriate helper
class and proxy to it, or stuff the full helper implementation
into the method.
class My_View extends Zend_View
{
/**
* @var array Registry of helper classes used
*/
protected $_localHelperObjects = array();
/**
* Proxy to url view helper
*
* @param array $urlOptions Options passed to the assemble method
* of the Route object.
* @param mixed $name The name of a Route to use. If null it will
* use the current Route
* @param bool $reset Whether or not to reset the route defaults
* with those provided
* @return string Url for the link href attribute.
*/
public function url(array $urlOptions = array(), $name = null,
$reset = false, $encode = true
) {
if (!array_key_exists('url', $this->_localHelperObjects)) {
$this->_localHelperObjects['url'] = new Zend_View_Helper_Url();
$this->_localHelperObjects['url']->setView($this);
}
$helper = $this->_localHelperObjects['url'];
return $helper->url($urlOptions, $name, $reset, $encode);
}
/**
* Echo a message
*
* Direct implementation.
*
* @param string $string
* @return string
*/
public function message($string)
{
return "<h1>" . $this->escape($message) . "</h1>\n";
}
}
Either way, this technique will substantially reduce the overhead of the helper system by avoiding calls to the PluginLoader entirely, and either benefiting from autoloading or bypassing it altogether.




