ClassMapAutoLoader
和onBootstrap
之间的区别是什么?
答案 0 :(得分:2)
Web应用程序由许多PHP类组成,每个类通常驻留在单独的文件中。这引入了包含文件的需要。
随着应用程序规模的扩大,可能难以包含 每个需要的文件。 Zend Framework 2本身由数百个文件组成, 并且加载整个库及其所有库可能非常困难 依赖这种方式。而且,在执行生成的代码时,PHP解释器会 即使您没有创建,也需要CPU时间来处理每个包含的文件 它的类的实例。
为了解决这个问题,在PHP 5.1中,引入了类自动加载功能。
PHP函数spl_autoload_register()
允许您注册
自动加载器功能。对于复杂的网站,您甚至可以创建
几个自动加载器功能,链接在一个堆栈中。
在脚本执行期间,如果PHP解释器遇到类名 它尚未定义,它调用所有已注册的自动加载器功能 反过来,直到自动加载器功能包括类或“未找到”错误为止 提高。当PHP解释器处理类时,这允许“延迟”加载 仅在类调用的时刻定义,当它确实需要时。
为了让您了解自动加载器功能的外观,下面我们提供一个 简化了自动加载器功能的实现:
<?php
// Autoloader function.
function autoloadFunc($className) {
// Class map static array.
static $classMap = array(
'Zend\\Mvc\\Application' => '/path/to/zend/dir/Zend/Mvc/Application.php',
'Application\\Module' => '/path/to/app/dir/Application/Module.php',
//...
);
// Check if such a class name presents in the class map.
if(isset(static::$classMap[$className])) {
$fileName = static::$classMap[$className];
// Check if file exists and is readable.
if (is_readable($filename)) {
// Include the file.
require $filename;
}
}
}
// Register our autoloader function.
spl_autoload_register("autoloadFunc");
在上面的例子中,我们定义了autoloadFunc()
自动加载器功能,
我们将进一步称之为类地图自动加载器。
类映射自动加载器使用类映射在类名和之间进行映射 包含该类的PHP文件的绝对路径。类映射只是一个普通的PHP 包含键和值的数组。要按类名确定文件路径,请执行 类映射自动加载器只需要从类映射数组中获取值。 很明显,类地图自动加载器的工作速度非常快。但是,缺点 这是你必须维护类映射并在每次添加新映射时更新它 上课程。
在每个HTTP请求中,Zend\Mvc\Application
对象已创建。应用程序的“生命”包含几个阶段。
Zend Framework 2使用 event 的概念。一个类可以触发一个事件,
和其他类可以监听到事件。从技术上讲,触发事件意味着只调用另一个类的“回调”方法。事件管理在里面实现
Zend\Mvc\EventManager
组件。
每个应用程序生命周期由应用程序通过触发事件启动。其他 类(属于Zend Framework或特定于您的应用程序)可能会听 事件和相应的反应。
下面列出了四个主要事件(生命阶段):
<强>自举即可。当应用程序触发此事件时,模块有机会
在onBootstrap()
注册自己作为进一步应用事件的监听者
回调方法。
<强>路线即可。触发此事件时,将使用路由器类(通常使用。)分析请求的URL
Zend\Mvc\Router\Http\TreeRouteStack
课程。如果URL和路由之间完全匹配
找到后,请求将传递给分配给路由的特定于站点的控制器类。
<强>调度即可。控制器类使用相应的操作方法“调度”请求 并生成可以在网页上显示的数据。
<强>渲染即可。在此事件中,控制器的action方法生成的数据将被传递以进行渲染
Zend\View\Renderer\PhpRenderer
课程。渲染器类使用a
查看模板文件,用于生成HTML页面。
为了让初学者更好地理解上述概念,我会推荐Zend Framework 2.0 by Example: Beginner’s Guide本书或Using Zend Framework 2电子书。你可以自己选择这本书。