`
yangyz1984
  • 浏览: 34826 次
  • 性别: Icon_minigender_1
  • 来自: 安徽省
社区版块
存档分类
最新评论

在Zend Framework中自动加载(Learning Zend Framework翻译2)

阅读更多

目录

介绍
目标与设计
自动加载的基本用法
资源的自动加载
结论
介绍
自动加载是一种机制,这种机制可以在你的PHP代码中无需手动设置依赖的文件。每一个 » the PHP 自动加载手册中都强调,一旦自动加载器被定义,它“在你试图使用一个还没被定义的类或接口,将被自动调用”

使用自动加载,你无需担心一个类在你的项目中的什么地方。使用良好定义的自动加载,你无需担心一个类文件相对于当前类文件的什么位置;你只要简单的使用这个类,自动加载器将会执行文件查找任务。

另外,自动加载,因为它直到最后一刻才载入并确信匹配只出现一次,是一次巨大的性能提升——特别是在你部署之前如果花时间清除require_once()调用的时候

Zend Framework鼓励使用自动加载,并提供许多工具提供库代码和应用程序代码的自动加载。这个教程覆盖了这些工具,也告诉你如何高效的使用它们。

目标与设计
类的命名约定
为了明白Zend Framework中的自动加载,首先你需要明白类名和类文件的关系。

Zend Framework从PEAR中借鉴了一个思想,即类名和文件系统是一个1:1的关系。为了解决文件路径,简单的将下划线”_”替换为目录分隔符,然后加上后缀“.php”。比如,“Foo_Bar_Baz”将对应文件系统中的"Foo/Bar/Baz.php"。假设该类也可以通过PHP的include_path设置来解决,它允许include()和require()在include_path中通过相对路径寻找文件名

另外,每一个PEAR及PHP 项目,我们使用并推荐为你的代码使用供应商(vendor)或者项目前缀。这意味着你写的所有类将分享同一个类前缀;比如,在Zend Framework 中的所有代码有“Zend_”前缀。这个命名约定帮助防止命名冲突。在Zend Framework中,我们经常称之为“命名空间”前缀;注意不要把它与PHP的本地命名空间混淆(be careful not to confuse it with PHP's native namespace implementation)。

Zend Framework在内部遵循这些简单的规则。我们的代码标准鼓励你这样做,就像对所有的库代码一样。

自动加载器的协定和设计
Zend Framework的自动加载支持,首先由Zend_Loader_Autoloader提供,有下面的目标和设计元素:

·         提供命名空间匹配。如果类的命名空间前缀不在注册的命名空间列表中,则立即返回FALSE。这样就可以比较乐观的匹配,就像会退到其他的自动加载器(This allows for more optimistic matching, as well as fallback to other autoloaders.)

·         允许自动加载器作为一个备份的自动加载器。在一个团队可能分布很广泛,或者使用一个未确定的命名空间前缀设置的情况下,自动加载器应该仍然被设置的以便它试图去匹配任何命名空间前缀。注意,这种做法是不推荐的,因为它会导致不必要的查找

·         允许触发错误抑制。我们感觉到——伟大的PHP社区也是这样的——错误抑制是一个坏主意。它昂贵并且覆盖非常真实的应用程序问题。所以,默认情况下,它应该是关的。然而,如果开发者坚持打开它,我们也允许这么做。

·         允许指定为自动加载自定义回调。一些开发者不想去使用Zend_Loader::loadClass()去自动加载,但是仍然想去使用Zend Framework的机制。Zend_Loader_Autoloader允许为自动加载指定一个候选的回调

·         允许操作SPL自动加载链。这样做的目的是允许指定另外的自动加载器——比如,类的资源加载器没有与文件系统有1:1的映射关系——在主Zend Framework自动加载器之前或之后被注册

自动加载器的基本用法

 

既然我们已经懂得了什么是自动加载,并懂得了 Framework自动加载解决办法的目标和设计。下面让我们开看看怎么去使用Zend_Loader_Autoloader。

在最简单的情况下,你只需要require这个类,然后实例化它,因为Zend_Loader_Autoloader是一个单态(singleton)的(因为SPL自动加载器是一个单个资源的原因),我们使用getInstance()去获取一个实例。

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
默认情况下,这将允许你载入任何带有"Zend_" 或者 "ZendX_"的类命名空间前缀的类,只要它们在你的include_path里

如果你有其他的命名空间前缀要去使用会发生什么?最好的、最简单的方法是在实例上调用registerNamespace()方法

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Foo_');
$loader->registerNamespace(array('Foo_', 'Bar_'));
或者,你可以告诉Zend_Loader_Autoloader去担当一个“后备(fallback)”自动加载器。这意味着它将不管命名空间前缀都将去处理任何类。

$loader->setFallbackAutoloader(true);
警告

不要使用后备(fallback)自动加载器

当试图去使用Zend_Loader_Autoloader作为后备自动加载器时,我们不推荐这样做。

内部的,Zend_Loader_Autoloader 使用 Zend_Loader::loadClass()来导入类。那个方法使用include()试图导入给定的类文件,如果不成功include()将返回一个布尔量FALSE,而且发布一个PHP警告。后者实际上可能会导致一些问题:

如果display_errors是启用的,警告将包含在输出中
一来你已经选择的error_reporting级别,它可能也会弄乱你的日志
你能够压制错误信息(Zend_Loader_Autoloader文档详细介绍这个),但是注意当display_errors是启用的,压制仅仅是相关的;错误日志将也会总是显示消息。因为这些原因,我们推荐总是设置能被自动加载器意识到的命名空间前缀

注: 命名空间前缀vs PHP 命名空间

在写这个教程的时候,PHP5.3已经发布了,在这个版本下,PHP现在已经官方支持命名空间了。

然而,Zend Framework在日期上早于PHP5.3建立,命名空间同样也是这样。在Zend Framework中,我们指的“命名空间”是实践上的命名空间,即带有厂商(vendor)“命名空间”为前缀的类。举例来说,所有的Zend Framework类名称都以“Zend_”为前缀——那就是我们的厂商(vendor)“命名空间”

Zend Framework计划在将来版本中的自动加载器中提供本地PHP命名空间支持。并且,它的自己的library将在2.0.0版本中使用命名空间

如果你有一个希望使用Zend Frameworkd 自定义的自动加载器——也许你也使用一个第三方库中的自动加载器——你可以使用Zend_Loader_Autoloader的pushAutoloader()和unshiftAutoloader()方法来管理。这些方法将相应的在后面或前面面(append or prepend)添加自动加载器到一个被称为前执行Zend Framework的内部自动载入机制链(These methods will append or prepend, respectively, autoloaders to a chain that is called prior to executing Zend Framework's internal autoloading mechanism)。这种方法具有以下优点:

每种方法接受可选的第二个参数:类命名空间前缀。这可以用来指示给定的自动加载器应该仅仅在寻找带有指定类前缀的类时被使用。如果处理的类没有那个前缀,自动加载器将被跳过——这将导致性能改进
如果你需要操作spl_autoload()的注册表,任何自动加载器即指向实例方法的回调可能会造成问题(any autoloaders that are callbacks pointing to instance methods can pose issues),因为spl_autoload_functions()不返回确切的同样回调。Zend_Loader_Autoloader没有那样的限制。
管理这种方式的自动加载器可以使任何有效的PHP回调(Autoloaders managed this way may be any valid PHP callback)。

// Append function 'my_autoloader' to the stack,
// to manage classes with the prefix 'My_':
$loader->pushAutoloader('my_autoloader', 'My_');
 
// Prepend static method Foo_Loader::autoload() to the stack,
// to manage classes with the prefix 'Foo_':
$loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_');
资源自动加载

如果你通读autoloader的设计目标,在那节的最后一点指出解决方法应包括这个情况。Zend Framework用Zend_Loader_Autoloader_Resource做这些事情

资源仅仅是一个对应组件命名空间(其加在自动加载器命名空间之后)的名字和路径(其是相对于自动加载器基路径)。在动作中,我们将象下面这样做:

$loader = new Zend_Application_Module_Autoloader(array(
    'namespace' => 'Blog',
    'basePath'  => APPLICATION_PATH . '/modules/blog',
));
一旦你在合适的位置有了加载器,你就需要将许多的它知道的资源类型通知它(you then need to inform it of the various resource types it's aware of)。这些资源类型是简单的子树(subtree)和前缀的配对

 

举例来说,考虑一下下面的树

path/to/some/resources/
|-- forms/
|   `-- Guestbook.php        // Foo_Form_Guestbook
|-- models/
|   |-- DbTable/
|   |   `-- Guestbook.php    // Foo_Model_DbTable_Guestbook
|   |-- Guestbook.php        // Foo_Model_Guestbook
|   `-- GuestbookMapper.php  // Foo_Model_GuestbookMapper
我们第一步是创建资源加载器:

$loader = new Zend_Loader_Autoloader_Resource(array(
    'basePath'  => 'path/to/some/resources/',
    'namespace' => 'Foo',
));
下一步,我们需要去定义一些资源类型。

Zend_Loader_Autoloader_Resourse::addResourceType()有三个参数:资源“类型”(任意字符串)、基路径下的可能存在资源类型的路径和为资源类型使用的组件前缀。在上面的树中,我们有三个资源类型:表单(在 “forms” 子目录中,带有一个组件前缀“Form”)、模型(在“models”子目录中,带有一个组件前缀“Model”)和dbtable(在“models/DbTable”子目录中,带有“Model_DbTable”组件前缀)。我们像下面这样定义它们

$loader->addResourceType('form', 'forms', 'Form')
       ->addResourceType('model', 'models', 'Model')
       ->addResourceType('dbtable', 'models/DbTable', 'Model_DbTable');
一旦定义了,我们能够简单的使用下面的类

$form      = new Foo_Form_Guestbook();
$guestbook = new Foo_Model_Guestbook();
注:模块(module)资源的自动加载

Zend Framework 的MVC层鼓励使用“模块(modules)”,它是在你的站点中自包含的应用程序。默认情况下模块典型的有许多资源类型,Zend Framework甚至为模块推荐一个标准的目录布局。资源自动载入器因此在这个范例中是非常有用的——那么的有用以至于,当你为你的模块(module)创建扩展于Zend_Application_Module_Bootstrap的一个引导类(bootstrap class)时,默认情况下它们是启用的。更多的信息请参考Zend_Loader_Autoloader_Module 文档。

结论
Zend Framework鼓励使用autoloading,甚至在Zend_Application中默认初始化它。希望这个教程最大程度的提供给你需要使用的Zend_Loader_Autoloader的信息以及通过附加自定义的自动加载器或者资源自动加载器来扩展它的功能。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dxcjpu/archive/2010/05/11/5578581.aspx

分享到:
评论

相关推荐

    zend framework中英文手册.rar

    2. **MVC 架构**:理解 MVC 模式的工作原理,如何在 Zend Framework 中实现。 3. **组件使用**:学习如何使用各种组件,如路由、控制器、模型、视图助手等。 4. **依赖注入**:理解依赖注入的概念,以及在 Zend ...

    zend framework 中文手册

    在 Zend Framework 中,Model代表业务逻辑,View负责呈现数据,Controller处理用户请求并协调Model和View。 4. **ZF1 版本**: "ZendFramework-1.9.2" 指的是 Zend Framework 1.x 系列的一个版本,1.9.2 是这个系列...

    Zend Framework 2 Application Development

    Whether you are learning Zend framework from scratch or looking to sharpen up your skills from previous versions, Zend Framework 2 Application Development will help you to harness the power of Zend ...

    ZEND FRAMEWORK 1.11.7 中文参考文档

    •Learning Zend Framework •Zend Framework Quick Start •Autoloading in Zend Framework •Plugins in Zend Framework •Getting Started with Zend_Layout •Getting Started Zend_View Placeholders •...

    ZendFramework-1.10.4-minimal

    在 Zend Framework 中,模型处理业务逻辑,视图负责渲染数据,控制器作为模型和视图之间的桥梁。 3. **组件库**:Zend Framework 提供了一个强大的组件库,如 Zend_Db 用于数据库操作,Zend_View 用于视图渲染,...

    Zend Framework 2 官方教程汉化版

    Zend Framework 2 官方教程汉化版

    Zend Framework 中文 手册 入门教程

    Zend Framework 中文 手册 2008年12月01日.chm MD5: DD29C39D12E9C0B38FD3475A12D05B73 SHA1: 1A6BBBF9311013F2FF2BF97752332160ED767526 CRC32: 88210ABD Zend Framework 入门教程(简体中文1.52版)v0.12.pdf MD5:...

    ZendFramework中文手册HTML版

    本手册是由热爱 PHP 的开发者 Haohappy 等人翻译的中文版本,为中国的 PHP 开发者提供了一个方便、易懂的学习资源,以克服语言障碍,更好地理解和应用 Zend Framework。 **一、Zend Framework 基础概念** Zend ...

    zendFramework中文手册

    在 zend Framework 中,每个功能模块都被封装为一个独立的组件,如路由、控制器、模型、视图、数据库访问等。这种组件化设计使得开发者可以按需选择和组合所需功能,提高开发效率。例如: 1. **MVC 模型**:Model ...

    基于Zend Framework 框架的CMS PHP 源代码

    在开始使用基于Zend Framework的CMS源代码之前,我们需要先进行必要的环境搭建。首先,确保已经安装了PHP运行环境,并且版本符合 Zend Framework 的要求。接着,下载并解压提供的源代码,将Zend和Zendx库放置在项目...

    ZendFramework 1.12.9 代码和文档.rar

    在Zend Framework中,MVC模式被用来分离业务逻辑、数据处理和用户界面。模型(Model)负责处理数据和业务逻辑;视图(View)用于展示数据,通常包含HTML和模板;控制器(Controller)作为模型和视图的桥梁,接收用户...

    Zend Framework+smarty用法实例详解

    在Zend Framework中整合Smarty模板引擎,可以让开发人员利用Zend Framework强大的框架特性和Smarty简洁的模板语法来创建更为复杂和功能丰富的Web应用。以下是整合Zend Framework与Smarty时需要了解的相关知识点。 ...

    Zend framework 中文手册

    Zend Framework (ZF) 是用 PHP 5 来开发 web 程序和服务的开源框架。ZF 用 100% 面向对象编码实 ... 不论你的程序需要什么,你都可能从 Zend Framework 中找 到全面测试的组件来极大地减少开发时间。

    zend framework 2手册

    这些章节可能介绍了如何在Zend Framework 2项目中使用CSS、JavaScript和其他前端技术,以及如何处理国际化和本地化。 最后,表单和动作章节讲解了如何在Zend Framework 2中创建和处理表单,这对于构建交互式应用...

    ZendFramework中文帮助手册 1.11.4

    自己编译的里面包含 ZendFramework 1.11.4 中文帮助手册 ZendFramework 1.11.4 api doc ZendFramework 1.11.4 的一个guestbook。 想要就下,不想要就看看.

    ZendFramework中文文档

    1. Introduction to Zend Framework 1.1. 概述 1.2. 安装 2. Zend_Acl 2.1. 简介 2.1.1. 关于资源(Resource) 2.1.2. 关于角色(Role) 2.1.3. 创建访问控制列表(ACL) 2.1.4. 注册角色(Role) 2.1.5. 定义访问...

    zendframework1.9中文用户手册 CHM版本

    zendframework1.9中文版用户手册 直接从网站上下载的离线版本 非常方便 这个是.chm的 还有.exe的版本,方便大家使用。

    zend framework2例子album 完整能运行

    Zend Framework 2(ZF2)是一个面向对象的、模块化且高性能的PHP开发框架,用于构建Web应用程序和服务。本示例“album”是ZF2官方提供的一个基础教程项目,旨在帮助开发者快速理解和学习如何在ZF2中进行实际的开发...

    zend framework 中文手册下载

    在 Zend Framework 中,你将学习如何创建模型、视图和控制器,以及它们之间的交互。 3. **数据库集成**:Zend_Db 提供了与各种数据库系统的连接和操作,包括 MySQL、PostgreSQL 和 SQLite 等。手册将教你如何配置...

    Zend Framework 2 基础教程

    在本教程中,我们将深入了解如何使用 PHP 的 Zend Framework 2 (ZF2) 构建一个简单的数据库驱动应用。通过遵循 Model-View-Controller (MVC) 设计模式,我们将创建一个能够管理音乐专辑收藏的应用程序。 #### 二、...

Global site tag (gtag.js) - Google Analytics