我们程序员是自相矛盾的懒汉。我的意思是我们会花上数小时甚至几天的时间来创建一个东西,让我们用 30 秒钟完成 5 分钟才能完成的任务。因此,Zend 框架的创建也许不是一件太让人惊奇的事情。您尚未听说过 Zend 框架吗?不要急 —— 您会了解的。本文概要介绍了 Zend 框架,解释了它的一般概念,并为 “理解 Zend 框架” 系列的其余部分做好准备,其余部分将通过遍历一个新的在线 RSS/Atom 提要阅读器的创建过程来深入到该框架的细节之中。在本文中不会有太多编码,但在其余部分中您应该熟悉 PHP。

   Zend 框架

   众所周知,几年前,在众多强大且易用的脚本语言中,PHP 占据着首要位置。大多数基于 UNIX? 和 Linux? 的 Web 服务器都安装了该语言。如果您是一个程序员,您很容易获得一个主机帐户来使用该语言。Ruby 曾经风靡一时,但现在已经没有多少人使用了。如果您曾经想使用动态生成的内容来构建一个网站,但却并不确定是否要使用诸如 J2EE 之类的应用服务器,那么您就极可能使用 PHP。它快速、易学、方便,您无需学习 Perl。

   然后情况很快改变。Ruby on Rails 震惊了编程界。Ruby on Rails 是面向对象和基于模型-视图-控制器 (MVC) 的典范,它提供了一种方式来实现我们都想实现的事情,即不费任何力气地创建一个网站。当然,仍然存在两个问题。一个问题是您需要学习一门新的编程语言。不管这门语言是什么样的,这都不是一项简单的任务。另一个问题是,如果您找到一台能运行 Ruby on Rails 的主机,那是非常幸运的,而大多数情况下不可能。如果您(像我一样)拥有一个 10 年的帐户,仅因为其缺少新的编程语言,那么放弃起来会犹豫再三的。当然,您这些年来编写的所有现有的 PHP 代码也是一个问题。您真的愿意把它们全部扔掉并重新开始吗?当然不是!

   一个有进取心的 PHP 程序员需要做什么呢?那就是创建一个囊括大多数上述新优势的新框架。Zend 框架由此诞生了。

   Zend 框架提供了简洁稳定的代码,也许最为重要的是,它是在明晰的知识产权下完成的。PHP 正在企业界跑马圈地,但如果您是一家财富 500 强公司,您不会愿意冒险将模块提交给一个也许是属于其他公司知识产权的知识库。

   准确地讲 Zend 框架究竟是什么呢?Zend 框架具有以下特征:

   是基于 PHP 建立的。
   是面向对象的。
   使用 MVC 范例。
   具有开放源码贡献者。
   有贡献者负责保证他们的代码不是他人的知识产权。
   通过建立 MVC 模式,Zend 框架的目标是使编程生活更加轻松,这不仅体现在通用领域,而且对您始终想要做的具体的事情也是如此,比如访问数据库或输出 PDF 文件。(也许您一直都不输出 PDF 文件。但如果它更简单的话,我想您会去这样做的。)

Zend 框架组件包括:

Zend_Controller
此模块为应用程序提供全面的控制。它将请求转化为特定的行为并确保其执行。
Zend_Db
此模块基于 PHP 数据对象 (PDO) 并提供一种通用方式来访问数据库。
Zend_Feed
此模块使使用 RSS 和 Atom 提要变得简单。
Zend_Filter
此模块提供字符串过滤函数,如 isEmail() 和 getAlpha()。
Zend_InputFilter
对于 Zend_Filter,此模块是用来操作数组的,如表单输入。
Zend_HttpClient
此模块使您能轻易地执行 HTTP 请求。
Zend_Json
此模块使您能够轻易地将 PHP 对象转换成 JavaScript 对象符号,反之亦然。
Zend_Log
此模块提供通用日志功能。
Zend_Mail
此模块使您能够发送文本文件和多部分 MIME 电子邮件。
Zend_Mime
此模块被 Zend_Mail 用来解码 MIME 消息。
Zend_Pdf
此模块用来创建新的 PDF 文档,及加载和编辑现有文档。
Zend_Search
此模块使您能在现有文本上执行复杂搜索。例如,您可以建立一个搜索引擎,该引擎可以基于相关性或其他因素返回结果。
Zend_Service_Amazon、Zend_Service_Flickr 以及 Zend_Service_Yahoo
这些模块提供对这些 Web 服务 API 的简单访问。
Zend_View
此模块处理 MVC 模式的 “视图” 部分。
Zend_XmlRpc
此模块使您能够轻易地创建 XML-RPC 客户机。(已为将来计划好服务器功能。)
现在来看一下我们的目标和在实现这个目标的过程中将做些什么

   项目

   为了展示 Zend 框架的所有的内幕,需要一个涵盖 Zend 大部分功能的项目。那很好,因为我最喜爱的项目仍然是在线提要阅读器。为什么呢?因为我还未找到一个能够真正实现我想要实现的功能的项目。每当我掌握一门新技术时,我就试着制作一个比我以前用的要更好的提要阅读器。所以我们要创建一个新的在线 RSS/Atom 提要阅读器服务。

   这个世界真的需要另一个在线提要阅读器吗?也许。但我不介意我是其惟一的使用者。并且要点是:Zend 框架目标在于使我能用于项目上的东西足够简单。我用它们仅仅是因为我想,而不是因为我花了价值成百上千美元的研究来证明它。那么这个作为新闻管理器的宝贝应该实现些什么呢?目前来讲,它应当具备以下功能:

使用户能够保存提要或订阅的集合。
使用户能够阅读提要和单个条目。
使用户能够保存单个帖子。
使用户能够针对特定的文本来搜索已保存的条目。
使用户能够容易地阅读没有 RSS 提要的页面。
使用户能够打印帖子集合。

在本系列中,我将向您展示如何通过 Zend 框架来实现所有这些功能。本系列包括:

第 1 部分:基础
本文在总体上解释了这个项目和 Zend 框架。
第 2 部分:添加数据库
此教程展示如何使用 Zend_DB 模块创建并操纵用来存储订阅信息、已保存条目和其他信息的中央数据库。
第 3 部分:提要
现在我们把提要加入到这个整体中来,使用户能够创建一个帐户、订阅特定的提要,并显示这些提要。此教程使用 Zend_Feed 和 Zend_Inputfilter 模块,后者用来检验电子邮件地址并去除提要条目中的 HTML 标记。
第 4 部分:当没有提要时:Zend_HTTPClient 模块
并非所有的站点都有提要,但在同一个地点追踪所有的东西还是有用的。这篇文章展示了如何使用 Zend_HTTPClient 模块来创建代理将数据拖入提要阅读器界面中。
第 5 部分:创建 PDF 文件
此教程解释如何使用 Zend_PDF 模块来用保存的文章、图像和搜索结果创建定制的 PDF 文件。
第 6 部分:发送电子邮件
这篇文章解释如何使用 Zend_Mail 模块提醒用户有新的帖子和订阅的提要,甚至使用 HTML 格式的电子邮件发送这些帖子。
第 7 部分:搜索
这篇文章解释如何使用 Zend_Search 模块针对一个特定的搜索条件搜索现有的和已保存的日志条目,并返回排列好的结果。
第 8 部分:添加相关的信息和服务
此教程解释如何使用 Zend_Service 模块从其他服务特别是从 Amazon、Flickr 和 Yahoo! 获取信息。此界面将使用 Ajax 从当前日志条目或者用户指定的搜索条件中获取相关的书、照片和搜索结果。
第 9 部分:添加 Ajax
Zend 框架通过本地 PHP 对象同 JavaScript 对象符号 (JSON) 之间的自动互换使得在应用程序中添加异步的 JavaScript + XML (Ajax) 交互变得简单。这篇文章展示了如何将此功能添加到提要阅读器中,还简单描述了 JSON。

  安装

  Zend 框架不需要任何特别的安装,但您需要牢记一些需求。Zend 框架需要 PHP V5,它同 V5.0.4 及以上版本兼容,所以您可以使用而不是必须用 V5.1。但无论如何,您必须确保库目录包含在 include_path 中,Zend 框架将从中寻找其所有的文件。要想这样,请确保在 php.ini 文件中设置 include_path,如:

; Windows: “\path1;\path2”
include_path = “.;c:\php\includes;e:\sw\zendframework\library”
这样就可以了。

  MVC 模式

  提到图形设计,我不可能知其不可为而为之,因为这不是我所擅长的。然而,给我一个其他有天赋的人拼凑好的设计,我可以用那个界面完成您想完成的任何事情。因而,能够分解好一个基于网络的应用程序的设计相关的工作是非常有利的,这样,设计人员、编码人员和 DBA 都可以做他们各自擅长的事情。这就是 MVC 模式的实质,它将一个项目分解成三层。

  模型层 由真实数据的表示组成。例如,在我们的提要阅读器项目中,包含了用户、提要和提要条目。它们在数据库中的表示总体上 “建模” 了它们的结构,从而组成了模型层。

  视图层 由一些逻辑组成,这些逻辑实际上定义了显示的数据如何表现。它并不决定这些已显示的数据是什么,而仅仅是它们如何表现。理想状态下,该模块不包含任何逻辑,只接受所给信息,并把它们显示出来。

  控制器 实际上定义了数据是什么。事实上,控制器是所有逻辑存放的地方。在 Zend 框架中,该层控制了要执行的行为。例如,如果我想要显示单个提要条目对象,那么职责被解析为:提要条目对象具有一个控制器,该控制器定义了当调用显示行为时所发生的事情。该显示行为回调以从模型(或者说是数据库或其他持久性存储器)中获取需要的数据,然后将这些字段 —— 如标题、内容、持久链接等 —— 填入视图中,该视图可以将其简单地显示在浏览器中。

  应当承认,对大多数程序员来说,这是一次启程。尽管存在对象,但 PHP 始终是一门过程化的语言。尽管如此,这项交易是绝对值得的。按照 MVC 模式构建应用程序远要比构建一个里面乱成一团的应用程序要简单的多。

  现在,让我们来看看您需要做些什么。

  编码准则

  当您为 Zend 框架编码,或使用其编码时,您应该遵循特定的准则。这些准则是为了使团队项目变得更加简单而设计的。换句话说,通过定义编码规范,您不仅能避免接下来的问题,而且能够使其他人更容易阅读您的代码。Zend 框架文档中包含几页指导准则,比如:

  确保文件整洁。换句话说,在文件头、标准的四格缩进等前面不能有任何前导或者后置的空格,这些空格会调用 Web 服务器导致意外地发送内容。
有且只有当类作为 Zend 框架的一部分时,而不仅仅是使用 Zend 框架时,类名才以 Zend_ 开头。
在函数名中下划线是禁止的。而是使用小写开头大小写间隔的方式(如 getTodaysDate())。
只有当变量是 private 或 protected 类型时,才以下划线开头。
将所有的变量声明为 private、protected 或者 public,而不要使用 var。
使用标准的 PHP 标记(如 ),而不是简写方式 ()。
确保您的代码易于阅读。换句话说,当使用一个句号 (.) 连接文本时,确保在句号前后加上空格以便于阅读。同理,当声明一个数组时,要在逗号后面加上空格。
如果您必须通过引用传值,那只能在函数声明中这样做。调用时通过引用传值是不允许的。
任何 PHP 文件都必须包括能被 PhpDocumentor 阅读的文档,并且编码准则指定了特定的最少标记。
当然这并不是完整的编码准则列表,但它应能让您对所需要遵循的准则类型有所了解。查看文档了解整个准则列表,以使您的代码会更容易满足使 PHP 项目更易共享的承诺。

  结束语

Zend 框架提供了一种新的、特定于 IP 的方式来构建 PHP 应用程序。因此,Zend 框架旨在改善您的 PHP 编码体验。在本系列中,我们将使用 Zend 框架来构建一个 RSS/Atom 提要阅读器。本系列以后的部分将涵盖数据访问、搜索、Web 服务以及该框架的其他部分。在第 2 部分中,将创建登录系统并开始构建数据库。