全部博文(155)
分类:
2010-05-17 17:25:46
fgetcsv()
解析
CSV文件,并转化为PHP的原生格式。parse_ini_file()
解析
INI文件,并转化为PHP的原生格式。它的性能和CSV差不多。Zend_Translate
和Zend_Locale
都实现了缓存功能,它可以明显地提升性能。通常情况下,性能瓶颈在于读入文件,而不是实际的查找操作,使用缓存可以避免翻译和本地化文件的重复读取。
Zend_View
组件。相对于其它视图或模板引擎,
Zend_View
是相当高效的。因为直接用
PHP
编写视图脚本,就没有编译自定义标记的负担,也不需要担心编译后脚本的优化。当然,
Zend_View
也存在自己的问题:扩展的代价很大(视图助手),如果通过许多视图助手来完成关键功能,将会导致很大的性能开销。
Zend_View
中
的大部分方法实际上都是通过助手系统的重载来实现的。它赋予Zend_View极大的灵活性,不需要扩展Zend_View,提供应用所需的助手方法就可以,开发者在单独的类中定义助手方法,然后就可以像调用定义在Zend_View中的方法那样使用助手方法。这样既可以保持视图对象的简单性,也可以保证助手只在需要时被创建。Zend_View
通过插件载入器查找助手类文件。这意味着每一次调用助手,
Zend_View
需要把助手名字传给插件载入器,由它决定类名,如果未载入则载入助手,然后返回实例化的对象。因为
Zend_View
在内部缓存了已经加载的助手,所以下次再使用这个助手时,速度将会快很多,然而,如果应用中使用了很多助手,这个过程对系统性能的影响可能会很大。
Zend_View
,在子类中手动增加应用常用的助手方法。这些助手方法可以简单地作为一个代理,实例化一个相应助手类完成任务,当然也可以自己实现任务的所有操作。
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($view);
}
$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 "" . $this->escape($message) . "
n";
}
}
partial()
视图助手会因为克隆视图对象而产生性能瓶颈。有办法提高它的速度吗?partial()
视图助手接收三个参数:
$name
: 视图脚本的名字$module
: 视图脚本所在的模块名,或者当没有第三个参数且是一个对象或数组时,它将作为$model
参数。
$model
: 数组或对象,作为干净的数据赋值给视图,用于解析区域视图。partial()
的强大之处在于第二与第三个参数。
$module
参数允许临时加入指定模块的视图路径,从而解析该模块下的区域视图脚本;
$model
参数允许你显式地为区域视图指定变量。如果你根本没有用到这两个参数,那么请用
render()
代替!
partial()
。相反,你应该使用
Zend_View
内置的
render()
方法渲染视图。
action()
视图助手,允许开发者分发一个
MVC
动作并捕获它的输出。它向
DRY
原则迈近了一大步,促进了代码的复用。但是这也是一个代价高昂的操作。在
action()
视图助手内部,它会克隆请求和响应对象,调用分发器,然后调用对应的控制器和动作等等。
action()
视图助手同时加入
ZF
的
,由一个动作助手和前端控制器插件组成。它允许你将分发周期中需要调用的附加动作压入一个栈中。如果你在布局视图脚本中使用了
action()
,它可以用动作堆栈替换,完成视图的渲染,实现响应片段的分离。作为例子,你可以像下面那样实现一个
dispatchLoopStartup()
插件,为每个页面添加一个登录表单输入框:class LoginPlugin extends Zend_Controller_Plugin_Abstract
{
protected $_stack;
public function dispatchLoopStartup(
Zend_Controller_Request_Abstract $request
) {
$stack = $this->getStack();
$loginRequest = new Zend_Controller_Request_Simple();
$loginRequest->setControllerName('user')
->setActionName('index')
->setParam('responseSegment', 'login');
$stack->pushStack($loginRequest);
}
public function getStack()
{
if (null === $this->_stack) {
$front = Zend_Controller_Front::getInstance();
if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack')) {
$stack = new Zend_Controller_Plugin_ActionStack();
$front->registerPlugin($stack);
} else {
$stack = $front->getPlugin('ActionStack')
}
$this->_stack = $stack;
}
return $this->_stack;
}
}
然后
UserController::indexAction()
方法就可以通过
responseSegment
参数指定渲染哪个响应片段。在布局脚本中,你可以简单地输出该响应片段:
= $this->layout()->login ?>
action()
视图助手效率要高,因为它不需要克隆对象及重置它们的状态。此外,它可以确保所有的
pre/post分发插件会被调用,如果你是通过前端控制器插件实现ACL,那么这一点就显得特别重要。action()
是小题大做。如果大部分的业务逻辑都封装在模型中,而你只是简单地查询模型,并将结果传递给视图脚本的话,通过一个视图助手获取模型,查询数据,完成相应的操作,将是一个更高效简洁的方法。
class BugController extends Zend_Controller_Action
{
public function listAction()
{
$model = new Bug();
$this->view->bugs = $model->fetchActive();
}
}
// bug/list.phtml:
echo "
foreach ($this->bugs as $bug) {
printf("%s: %sn", $this->escape($bug->id), $this->escape($bug->summary));
}
echo "
action()
,将像下面这样调用:
= $this->action('list', 'bug') ?>
class My_View_Helper_BugList extends Zend_View_Helper_Abstract
{
public function direct()
{
$model = new Bug();
$html = "n";
foreach ($model->fetchActive() as $bug) {
$html .= sprintf(
"%s: %sn",
$this->view->escape($bug->id),
$this->view->escape($bug->summary)
);
}
$html .= "
n";
return $html;
}
}
= $this->bugList() ?>
action()
助手的开销,并且该
API
更易于理解。