PHP开发利器-PRADO 1.6(1)

- 中国WEB开发者网络 (http://www.webasp.net)
-- 技术教程 (http://www.webasp.net/article/)
--- PHP开发利器-PRADO 1.6(1) (http://www.webasp.net/article/28/27156.htm)
-- 作者:未知
-- 发布日期: 2005-12-23

第1章 入门

1.1  PRADO是什么?

PRADO是在PHP5环境下的一个基于事件驱动和基于组件的WEB应用开发框架。使用PRADO开发WEB应用,你主要需要做的工作就是使用已有的组件(原文是"实例化已经定义好的组件",熟悉面向对象编程的开发者可能比较容易理解这句话),设置组件的属性,为控件组件的各种事件编写对应的处理函数,然后把这些组织成一个个的页面。(译者注:个人倾向于将component翻译为组件,control翻译为控件,事实上大多数场合两者没有什么区别,但是为了读者能够更加容易理解原文,本文一律按此规则翻译。)这个过程和使用RAD开发工具(比如Delphi或者Visual Basic)来开发Windows应用程序非常类似。

  下面用一个简单的例子来说明PRADO框架的工作原理。假定我们现在要使用PRADO来开发一个常见的登录页面。首先我们选择PRADO中的2个TTextBox控件和1个TButton控件来分别对应用户名输入,密码输入和提交按钮。然后把对应密码输入的TTextBox控件的TextMode属性设置为"Password",并为TButton控件的OnClick事件指定一个处理函数login。最后把这些控件放到页面模板的合适的位置上(后面会解释什么是页面模板,实际上它和一个html页面很相似),一个功能完善的登录页面就实现了。控件会自己处理好如何显示数据,如何得到用户输入的数据,如何响应用户的操作等这些事情。例如,TTextBox控件会显示一个输入框让用户输入;用户输入的密码会被显示为*号,而开发者在代码中可以通过读取TTextBox控件的Text属性来获取用户实际输入的密码;当用户点击了提交按钮的时候,login 函数将会被自动调用。这和传统的PHP编程处理方式很不一样。使用传统的PHP编程方式,开发人员需要使用HTML标签来显示用户输入框和按钮,同时需要自己解析POST数据来获得用户的输入以及判断按钮是否被点击了等等这些事情。

PRADO

  基于组件的编程方式使代码的重用极为方便。一些重复性的单调的工作比如表单输入的验证,页面状态的管理等都可以使用PRADO已经提供的组件来处理。开发者也可以通过继承现有的组件或者组合现有的组件来开发新的组件满足要求。另外一些新的组件即将发布。

  总来的说,PRADO 为PHP的编程人员提供了以下的有益之处:

  • 可重用性 - 符合PRADO组件标准的代码是高度可重用的。
  • 易于使用 - 使用PRADO组件非常简单,通常只需要配置它们的属性,编写相关的事件处理函数。
  • 健壮性 - PRADO让开发者不再被那些令人厌烦的有很多错误的的代码所困扰。它的代码都是有对象,方法和属性组成的;而不是Url地址和各种query参数。PHP5最新的Exception处理机制也被引入进来,让开发人员能够精确定位到错误代码的所在行数。
  • 高效 - PRADO开发的Web应用运行很快。PRADO实现了一种缓存机制,使用其开发的应用的运行效率能够和那些通常使用的模版引擎开发的应用的运行效率相媲美。
  • 团队协作 - PRADO允许内容和表现方式分离。组件,尤其是页面,将内容(逻辑)和表现方式分别保存在不同的文件中。

  目前已经有很多PHP的框架,Mojavi, WACT , PHP.MVC, Phrame等等。它们主要是建立一套松散的PHP代码组织方式(比如 Model-view-controller)。其中一些更多的面向开发一个内容管理系统,并提供了诸如用户管理模块等更多的功能。

  和这些框架相比,PRADO更专注于建立一个代码重用和事件驱动的编程标准。如果你曾经用Delphi或者Visual Basic等这些RAD开发工具来开发Windows程序的话,那么你会发现使用PRADO来开发WEB应用是非常类似的,你可以很快就掌握PRADO来进行WEB应用的开发。大多数情况下,你要做的仅仅是设置组件的属性和响应组件的事件。更高层次的代码重用,比如前面所说的用户管理模块,可以基于PRADO组件来实现。

  PRADO的思想最先我是从Apache Tapestry项目想到的。在设计和实现的时候, Borland Delphi 和Microsoft ASP.NET的设计思想起到了很重要的作用 。实际上,使用过ASP.NET的人可以发现PRADO中有很多地方和它是相似的。



 

1.2  安装


 

  PRADO需要PHP5的环境,以及SimpleXML模块(PHP5缺省安装后的环境下已经包括了这个模块)。在Windows XP和RedHat Linux环境下,已经在Apache和IIS Web服务器上都通过了测试。

  PRADO框架使用一个.zip文件发布。在Linux下可以使用unzip,在Windows下可以使用Winzip来解压。解压完毕后,会在当前目录下创建一个目录prado。这个目录主要包括以下这些文件和目录:

 README.html            此项目的说明文件
index.html 和README.html中的内容是一样的
COPYRIGHT 此项目的版权信息
HISTORY 版本升级信息
framework/ PRADO框架的核心代码
examples/ PRADO的一些例子
docs/ PRADO的帮助文档

  完成了解压之后,把prado目录的所有东西复制到Web服务器的根目录下。(也可以把它复制到某一个子目录下,甚至更深层次的目录下,PRADO对此没有限制。如果你将它复制到了某一个子目录下,以下的URL地址需要做相应的修改。)

  非常简单,安装已经完成了!现在你可以试一下PRADO发布包中的三个例子了:``Hello, world!", the Hangman Game(一个猜单词的游戏), 和PRADO通讯录,它们的URL地址是:

  • ``Hello, world!" - http://<Web-server-address>/examples/helloworld.php
  • the Hangman game - http://<Web-server-address>/examples/hangman.php
  • the PRADO phonebook - http://<Web-server-address>/examples/phonebook.php

1.3  范例: Hello, World!

  在这一节中,我们主要来说明``Hello, world!''

  这个例子,让你对使用PRADO开发有一个印象。这个例子非常的简单,只有一个页面,上面显示了一个"Click me"的按钮。当用户点击了这个按钮,这个按钮的标题会变成``Hello, world!''。

  要完成这个功能需要这些文件,

  • helloworld.php , 应用的主入口;
  • helloworld/application.spec, 应用的配置文件;
  • helloworld/HomePage.php, 页面的类文件;
  • helloworld/HomePage.tpl, 页面的模板文件.

  注意,目录 helloworld 应该设置为Web用户不可以访问的(读的权限也不能给),因为其中的文件包括了一些重要的数据信息(比如数据库的连接口令等等)。不用担心这么设置Web用户会不能正常的访问,因为实际上他们根本不用去访问helloworld 目录中的文件。在其它使用PRADO开发的应用中你也应该这么做。

  在helloworld.php 文件中,程序主要是实例化 TApplication 这个类,(译者注:如果对实例化这个词不怎么理解,你也可以这么理解,就是申明一个类型为TApplication的变量。)并开始运行应用,代码如下:

 <?php require_once('../framework/TApplication.php');
$app=TApplication::getInstance('helloworld/application.spec');
$app->run();
?>

  这里我们假定框架的代码位于 ../framework 目录下。

  每一个 PRADO应用都应该有这么一个入口文件。他们之间主要的区别在于 getInstance
函数的参数的不同,这个参数指明了应用的配置文件的位置。

application.spec 是一个XML文件,用来配置应用级别的参数。(就好象全局变量一样,当然现在是只读的,我们正在决定是否下一版本中允许可读写的)在这个例子中,它包含了如下的代码:

 <?xml version="1.0" encoding="UTF-8"?>
<application default-page="HomePage" cache-path="">
<alias name="Pages" path="." />
<using namespace="System.Web.UI.WebControls" />
<using namespace="Pages" />
</application>

  <alias> 元素(译者注:按XML文件通常的译法,<alias>...</alias>整个翻译为元素,其中alias翻译为元素的标签,一对闭合的alias标签中的值翻译为元素值,name, path这些则翻译为属性名,它们的值翻译为属性值,参考"<标签 属性名= 属性值>元素值</标签>")定义了路径的别名。别名System 是系统内部定义好的,用来指示框架核心代码所在的目录。可以使用路径别名来定义命名空间。命名空间实际上就是一个加入到PHP搜索路径 include_path中的目录。 <using> 元素指明启动应用使用的命名空间。(也可以在代码中调用 using() 函数来使用一个命名空间) 

  <application> 的default-page 属性指明了应用启动时缺省进入哪一个页面。在这里我们指定了HomePage页面,它对应了一个页面类HomePage (关于页面和页面类后面会专门对它们进行解释的)。

  HomePage.tpl 文件是页面类HomePage一个模板文件,包含如下的代码:

 <html>
<head>
<title>Hello, world!</title>
</head>
<body>
<com:TForm>
<com:TButton Text="Click me" OnClick="clickMe" />
</com:TForm>
</body>
</html>

  它和HTML页面非常的相似。唯一不同的地方就是元素 <com:TButton> ,它代表了一个
TButton 组件。 TButton 组件将会显示为一个表单的按钮,按钮的标题是"Click Me","Click
Me"是在 Text 属性中被指定的。通过设置 OnClick ,可以指定页面方法 clickMe 来响应按钮的 OnClick 事件。因此,当按钮被点击的时候,方法 clickMe 就会被自动调用了。

  HomePage.php 文件包含了定义页面类 HomePage 的代码,如下:

 <?php
class HomePage extends TPage
{
function clickMe($sender,$param)
{
$sender->Text="Hello, world!";
}
}
?>

HomePage 类继承了 TPage 类。TPage 类是PRADO框架本身提供的,它是所有页面类的基类。HomePage 类只包含了一个方法clickMe ,这个方法就是刚才我们提到的页面模板中响应按钮OnClick 事件的方法clickMe  。这个方法的代码的作用是设置事件的发送者$sender(这里就是这个按钮)的Text 属性为 ``Hello, world!"。我们期望当用户点击这个按钮的时候,按钮的标题改为``Hello, world!" 。
  这个包含在 PRADO 发布包中的例子可以通过此URL来访问:href="http:///examples/helloworld.php">http://<Web-server-address>/examples/helloworld.php
.
  你可能会说完成这么一个简单的功能有什么大惊小怪的。是的,这个功能确实非常简单,用几行php代码就可以完成。但是这个例子主要是目的是为了让你感受一下PRADO编程方式,它是面向对象的,基于组件和基于事件驱动的。用类似的编程方式可以实现更复杂的功能,请继续看下面几章。


第2章 用PRADO编程

  现在让我们更深入的了解一下PRADO框架。这一章我们会介绍一些框架的基本概念和如何使用现有的PRADO组件来开发一个PRADO应用。

2.1  组件


  根据Clemens Szyperski的说法, ``软件组件是一个具有特定接口的组合单元,可以独立存在,参与组成其它组建。''

  在PRADO中, 组件是 TComponent 或者其子类的实例。PRADO框架中已经包括了 TComponent
类,它主要实现了组件的属性和事件机制。

  • 属性可以被认为是描述组件某一特性的公共变量,比如背景颜色,字体大小等等。属性是有类型的,比如 string, integer , 等等。属性可以是只读的,也可以是可读写的。
  • 事件使代理函数可以对组件中进行的一些活动作出响应,比如鼠标的点击,输入文本的变化等。

  一个组件会继承它所有父类组件的属性和方法,因为组件本身其实就是一个类。

  一个完整的组件类定义包括两个文件:

  • 一个类文件,它定义了组件类的逻辑。这个文件主要是PHP代码。这个文件的文件名必须和类的名字一样,而且以.php 作为文件后缀。
  • 一个规格文件,它定义了组件类的属性和方法。这个文件是XML格式。如果这个组件类没有定义父类之外的新的属性和事件,那么这个文件是可以省略不要的。缺省情况下,这个文件和组件的类文件在一个目录中,而且名字是一样的,唯一不同的是它们的文件名后缀(类文件的后缀是.php ,规格文件是 .spec )。值得注意的是,PRADO也允许你用不同的文件名来命名规格文件和模板文件,但是类文件名还是必须遵循与类同名,并且后缀为.php 的规则的。这时候你需要在类的常量SPECIFICATION_FILE中指定规格文件的包含路径的文件名,可以使用绝对或者相对路径(相对类文件所在位置)。

  注意:PRADO 是区分大小写的,组件类型,属性名称,事件名称,文件名等等这些都是区分大小写的。


 2.1.1  控件

  控件是定义了用户界面的PRADO 组件。每一个控件都有一个父控件和一些子控件(注意,这里的父,子这些关系和面向对象中的父类子类的概念是完全不一样的。一个控件是另外一个控件的父控件只是说明了前者拥有后者,这个拥有关系可以理解为一个目录下包含了一个子目录;而绝不是后者是前者的子类、是从前者继承而来的这个概念)。页面是最高级别的控件,它没有父控件(当然你也可以认为Application是它的父控件)。一个PRADO的应用是一个页面的集合,每一个页面都代表了一个层次树状结构的控件集,控件与控件之间关系是通过父子关系联系在一起的。

  这种父子关系可以通过模板文件来建立。模板文件的格式和HTML是很像的,只不过在HTML的基础上增加了一些特殊的标签来定应控件。如果一个控件的标签被另外一个控件的标签所包括,那么前者就被认为是后者的子控件。静态文本也被认为是子控件。

  控件可以拥有一个模板文件来描述它的界面内容。缺省情况下模板文件和类文件在同一个目录下,而且文件名是相同的,模板文件的后缀则为 .tpl 。同规格文件一样,如果你需要把模板文件放在不同地方或者用鳖的文件名,可以通过设置类常量 TEMPLATE_FILE 的值来指明模板文件的位置。

  每一个控件都有一个ID,它可以在同一级别的控件中来唯一标识控件本身。ID路径则是在控件的树状结构中,从当前控件到目标控件的所有控件ID的序列,它可以用于访问一个控件。比如,在
HomePage中,有一个 Menu 控件,它拥有一个子控件 Button 。对于控件HomePage而言,可以通过ID(Menu,Button)路径来访问 Button 控件。如果用PHP代码来书写,就是 $this->Menu->Button .

  2.1.2  实例化组件

  组件有两种方式来实例化。一种方法是在一个控件的模板文件中定义它,当这个控件被创建的时候,框架会自动的去实例化这个组件。还有一种方法是在PHP代码中手动的实例化。我们先来看一下前面一种静态的创建方法,稍后再来看一下动态的创建方法。

  


webasp.net