正在阅读:PHP开发利器-PRADO 1.6PHP开发利器-PRADO 1.6

2005-04-27 10:26 出处: 作者:Qiang Xue/著 薛繁/译 责任编辑:xietaoming

2.4  定义新组件

  有两种方法来定义新的组件类:继承和组合。

  继承是面向对象的设计概念。派生类定义它的父类的一些内容,还可以提供一些其他的功能。在PRADO框架中,组件的属性和事件都是可以继承的。派生类也可以提供更多的属性和事件。所有的组件类都应该从TComponent 或者它的派生类继承。

  所有父组件的属性和事件会被派生组件类继承。

  组合是用于基于组件的框架的。在PRADO中,主要对控件使用。一个新的控件类可以被定义为几个其他几个控件的组合。新的类负责协调这些控件之间的通信,并代表它们和外界通信。比如可以定义一个LabeledTextBox 控件类(继承TControl ),它由TLabel 一个控件和一个TLabel
控件组成。新的类负责配置这两个组成控件的属性和方法。

  一般的约定(并不强求),控件的ID和属性的首字母应该大写,比如HomePage, NavigateUrl,
LogoPict;事件以On开头,比如OnClick 。ID和属性的名字命名和变量命名一样,必须是以字母开头的,仅包括字母数字和下划线的字符串。

  要定义一个新的组件通常需要写一个组件类文件,一个规格文件和一个模板文件。有些时候后面两个文件可以不要的。

  2.4.1  定义属性


  组件的属性在组件类的规格文件中定义,规格文件的语法如下:

 <?xml version="1.0" encoding="UTF-8"?>
<component>
......
<property name="<property name>"
get="<getter method>"
set="<setter method>"
type="<property type>"
default="<default value>" />
......
</component>

  在这里,name 用来唯一标识属性;get 定义了一个类方法来读取属性,set 定义了一个类方法来写属性,type 定义了属性的类型(string, integer, float, boolean, arrayobject),default 标识了属性的缺省值。其中name 属性是必须的。getter方法的语法如下: 

 function getterMethodName()
{
....
return $value.
}

  如果一个属性是不可读的,那么不要设置get 属性。setter方法的语法如下:

 function setterMethodName($value)
{
// set some variable with $value
}

  如果一个属性是不可写的,那么不要设置set 属性。如果这个属性的类型是string,那么也可以不指明。类型的属性用来自动转换配置在规格文件或者模板文件中的属性初始值。default
属性一般用来作为引用的目的,也是可选的。如果一个属性是可读的而且之前没有被设置,那么getter方法应该返回一个缺省值。

  可以用下面的语法定义组件的组件属性:

 <?xml version="1.0" encoding="UTF-8"?>
<component>
......
<component type="component type" ID="component ID">
<property name="property name" value="property value"/>
....
<event name="event name" handler="function name"/>
....
</component>
......
</component>

  这里type 属性指明了组件类的名称,IDID 属性指明了属性名称。property 元素和event 元素指明了对应的初值。

  当组件被创建的时候,它的组件类型属性会自动被实例化。

  2.4.2  定义事件

  组件事件在规格文件中定义,而其内在的实现机制在类文件中定义。在规格文件中定义事件的语法如下:

 <?xml version="1.0" encoding="UTF-8"?>
<component>
......
<event name="..." />
......
</component>

  事件的name应该是一个合法的变量名。

  在类文件中,通常会实现这么一个对应的方法(假定事件的名称叫 OnClick):

 function onClick($param)
{
$this->raiseEvent('OnClick',$this,$param);
}

  当这个事件实际发生的时候,这个 onClick 方法应该确实被调用了(参考框架的TButton.php
文件)。raiseEvent 方法在TComponent 类中实现,它调用了所有对应OnClick 的事件响应函数,并把参数$param 传递给它们。

  2.4.3  编写模板文件

  在这一节里,会讲一些关于如何编写模板文件。模板是用于控件的,当时也不是所有的控件都需要模板。比如TTextBox, TButton 这些控件因为没有内容,因此就不需要模板。模板文件一般用于页面或者基于组合定义的控件。

  模板中的注释,比如 <!-- ... --> 被作为静态文本处理。

  可以在组件标签之外通过属性标签<prop:...>来配置组件的属性。比如可以用以下的代码配置模板中TTextBox 控件的Text 属性。

 ...
<com:TTextBox ID="profile">
<prop:Text>
...
</prop:Text>
</com:TTextBox>
...

  在一对属性标签中间的内容作为对应的组件属性的值。如果一些属性的值需要很大的数据,这样就很方便。

  在模板文件中可以使用3种特殊的标签:

  • <%include ... %> - 框架会在解析模板前在这个位置包含一个外部文件。比如,你可以用它在页面模板中包含一个公共头文件<%include header.tpl %> 。外部文件的路径应该是这个模板文件的相对路径。
  • <%= ... %> -会直接在这个位置上输出一个PHP表达式的值,比如<%= date('Y-M-d',time())
    %>
    。注意,表达式后面不需要输入分号。这个表达式的上下文环境是这个模板对应的组件,可以使用$this 变量来在表达式中使用组件。表达式的值在组件的绘制状态时计算。
  • <% ... %> - 代表了一系列PHP的语句。如果它们当中有echo或者print,那么其结果会显示在标签对应的位置。注意,这里PHP语句需要使用分号隔开,和标准的PHP语法是一样的。同样,这里的上下文环境依然是拥有此模板文件的组件。(译者注:很多地方都提到了上下文环境,这个词在有些面向对象的书籍中是这么翻译的,而有时候也被翻译成其他文字。它所指的是当前代码中代表的$this是哪一个组件。因为一个组件中可能包含了其他组件,比如页面中就经常包含了很多组件,那么如果这个模板是这个页面类的,那么我们此时的上下文环境是这个页面。有些时候,比如我们给页面中的某一个组件进行数据绑定的时候,上下文环境就改变成了这个组件,这时候,$this代表了此组件,而不再是页面)。在模板文件中,除了在组件标签范围内,在其他以外的地方可以自由使用其他各种标签。

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品