|
|||||||||||||||
WAP的发展离不开其WWW的底蕴,毕竟,整个WAP协议的制定参照了WWW的模型,并且尽可能地沿用了Internet的诸多标准和技术,如WML语言脱胎于HTML与XML,WMLScript与传统的脚本语言也很相似。的确,WAP虽然是个新名词,但是它却与传统的国际互联网密不可分地结合着,在结构上如此,在技术上更是如此。 |
|||||||||||||||
|
|||||||||||||||
看了WAP的介绍,大家应该开始逐步理解PHP为何仍能为WAP服务了。PHP与HTML、WML、Javascript、Java都不一样,它是在服务器端运行的,而Javascript、Java等都运行在浏览器端,相对于WAP,WMLScript运行于客户机端,但是,以上的这些语言都可以很容易与PHP结合起来。 |
|||||||||||||||
PHP的系统平台、工作方式、安装方法,这些都不在本文的讨论范围内,毕竟我们的重点是PHP如何与WAP协作。一般而言,为了能让PHP工作,我们需要带有PHP模块的Web服务器,或者说支持PHP的服务器,Apache是世界上最流行的Web服务器,另外,我们还需要安装PHP软件以及如MySQL这样的数据库,具体内容可以查阅相关书籍或网站。下面我们讨论如何让PHP产生WML代码。
我们可以将该文件存为index.php3,当WAP终端浏览该网站时,Web服务器会自动根据index.php3的内容产生如上所列的WML内容,并发送给网关进行处理。WAP终端收到该Deck后,将会在显示屏上显示"Hello World"的字样。 |
|||||||||||||||
进阶篇 *返回文章列表* |
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
进行面向对象的编程自然需要确定对象以及对象之间的联系。对于需要开发的WAP页面,应该首先确定其中的模块或元素的种类,然后可以以种类为单位确定对象的个数。
|
|||||||||||||||
|
|||||||||||||||
1.数据和函数定义 [TOP]
除了以上的常量定义外,我们还需要定义函数"convert_character"。对于一些WML语言保留字符如"&"、"<"、">"等,以及ASCII码值大于160的符号,如果需要在浏览器端显示则必需进行处理。对于"<"等保留字符,需要将它们转化为"<"的格式,对于大于161的符号,需要将它们转化为"&#x;"(其中x表示符号的ASCII码值)的格式。由于定义了该函数,那么程序后面需要用到此功能时(事实证明经常用到)直接调用该函数即可。
|
|||||||||||||||
2.对象实现
我们将利用以上定义的常量和函数实现我们定义的若干对象。我们从上层对象开始,逐步向下实现,上层对象可以调用下层对象的方法。在实现过程中可以经常参考图1,明确对象的关系。
2.1 Deck对象的实现 |
2.2 Text对象的实现 |
2.3 Image对象的实现 |
2.4 Table对象的实现 |
2.5 Row对象的实现 |
2.6 Hyperlink对象的实现 |
2.7 Input对象的实现 |
2.8 Select对象的实现 |
2.9 Do对象实现 |
2.10 Fieldset对象的实现 |
2.1 Deck对象的实现 [TOP]
首先确定Deck对象的属性,如表1所示。
属性名称 |
含义 |
$card_title |
标题 |
$card_alignment |
页面格式 |
$card_element |
Card所包含的元素,如Text、Table等 |
$element_number |
Card中所包含的元素数目 |
$default_item |
变量及其默认值数组 |
$default_number |
默认值数组元素数目 |
表1 Deck对象的属性 |
接着确定Deck对象的方法,如表2所示。
方法名(函数) |
功能 |
My_Deck |
自构函数,对象创建时被自动调用 |
Add_Element |
加入元素,如Text、Image、Table、Hyperlink、Input、Select、Do等 |
Make_Deck |
建立Deck(最关键的函数,它将最终产生需要的Deck) |
表2 Deck对象的方法 |
在我们所定义的函数中,比较复杂的是Add_Element函数和Make_Deck函数。
Add_Element函数的入口参数为任何一种所定义的元素,如Text、Image等。函数开始先进行入口参数的检查,判断是否为合法对象,这种检查还会经常出现在后续的对象实现中。如果检查入口参数不是对象,则将出错退出。接下来判断入口参数是否为我们已经定义过的对象种类,如果是,则将其假如到card_element属性中,并使element_number计数器加1。如果入口参数是无法识别的对象,则程序报错退出。
Make_Deck函数很复杂,我们按以下步骤实现:
1.发送标头;
2.产生Deck头代码;
3.利用相应对象封装的get_defaults函数获取某些元素,如Select、Fieldset等中的变量的默认值(如果存在);
4.如果缺省值存在,列出与缺省值相关的代码,即进入页面后自动刷新相应变量为缺省值;
5.设置页面格式;
6.对Deck中包含的每一个对象调用其封装的Make_Element函数产生各自的代码;
7.产生Deck结束代码。
虽然我们在此列出的步骤很简单,但是具体的实现却牵扯到很多细节,而这些实现需要编程人员对WML语言比较了解,特别是对Deck和Card的构造很熟悉。下面列出了其中比较复杂的获取变量默认值部分的代码和创建各元素部分代码的源程序,这两个部分体现了PHP语言面向对象编程的特点。
//获取交互元素如Input,Select的一些变量默认值 |
//产生相关元素各部分的代码 |
由于篇幅原因,细节实现不在此讨论,读者可以参阅所附的代码。
2.2 Text对象的实现 [TOP]
Text对象是我们定义的第1个元素对象。它包含的属性和函数如下表所示:
属性名称 |
含义 |
$text |
文本内容 |
$attribute |
文本格式属性 |
$br_count |
文本后空行数目 |
表3 Text对象的属性 |
方法名(函数) |
功能 |
My_Text |
自构函数,对象创建时被自动调用 |
set_br_count |
设置空行数目 |
My_Type |
返回对象类别(I_AM_TEXT) |
Make_Element |
产生与Text对象相关的代码 |
表4 Text对象方法 |
在各函数中,Make_Element函数将被Deck对象使用,My_Type函数也将被调用以供Deck对象确定本对象的类型。
Make_Element对象的实现比较复杂,其相关代码如下所示。在代码中,首先产生有关Text格式的代码,然后再产生Text内容,最后产生代码结尾。
//创建Text部分代码 |
2.3 Image对象的实现 [TOP]
Image对象代表了图象元素,其包含的属性和方法如下表所示:
属性名称 |
含义 |
$wbmp_url |
图片地址 |
$alt_text |
图片文本描述(当图片无法显示时则显示文本) |
$br_count |
图片后空行数目 |
表5 Image对象的属性 |
方法名(函数) |
含义 |
My_Image |
自构函数,对象创建时被自动调用 |
set_br_count |
设置空行数目 |
My_Type |
返回对象类别(I_AM_IMAGE) |
Make_Element |
产生与Image对象相关的代码 |
表6 Image对象方法 |
本代码定义了PHP库,用于创建WAP页面
|
常量定义部分
|
函数定义部分 [TOP]
//本函数实现特殊字符的转换 |
2.4 Table对象的实现
Table对象代表了表格元素,其包含的属性和方法如下表所示:
属性名称 |
含义 |
$table_row |
表格所包含的行,为Row对象的数组 |
$row_number |
表格所包含的行的数目 |
表7 Table对象的属性 |
方法名(函数) |
含义 |
My_Table |
自构函数,对象创建时被自动调用 |
add_row |
加入新行 |
My_Type |
返回对象类别(I_AM_TABLE) |
Make_Element |
产生与Table对象相关的代码 |
表8 Table对象方法 |
表格对象与Text与Image对象不太一样,它其中还包含了子对象Row,所以它创建代码时会调用子对象Row的Make_Element函数。Table的Make_Element函数代码如下所示:
//创建Table部分代码 |
2.5 Row对象的实现 [TOP]
Row对象是Table对象的属性之一,它所包含的属性与方法如下表所示:
属性名称 |
含义 |
$column |
行所包含的单元格,是一个数组,元素值可为Text或Image对象 |
$column_number |
行所包含的单元格数目 |
表9 Row对象的属性 |
方法名(函数) |
功能 |
My_Row |
自构函数,对象创建时被自动调用 |
Add_Element |
加入单元格 |
get_column_number |
返回单元格数目 |
My_Type |
返回对象类别(I_AM_ROW) |
Make_Element |
产生与Row对象相关的代码 |
表10 Row对象的方法 |
由于Row所包含的单元格也是我们所定义的Text和Image等对象,因而在创建其代码是会调用Text或Image对象的Make_Element函数。
"Deck--Table--Row--Text(Image)",这种包含关系体现了面向对象的编程观点,条理清晰,降低了设计难度。
2.6 Hyperlink对象的实现 [TOP]
Hyperlink对象代表了Deck所包含的超级链接,其属性和方法如下表所示:
属性名称 |
含义 |
$link_lable |
链接标记 |
$link_url |
链接地址 |
表11 Hyperlink对象的属性 |
方法名(函数) |
功能 |
My_Hyperlink |
自构函数,对象创建时被自动调用 |
My_Type |
返回对象类别(I_AM_HYPERLINK) |
Make_Element |
产生与Hyperlink对象相关的代码 |
表12 Hyperlink对象的方法 |
Hyperlink对象的实现很简单,这里不再讲解,可以参考所附代码。
2.7 Input对象的实现 [TOP]
Input对象代表了Deck元素中获取用户输入的元素,其属性和方法如下表所示:
属性名称 |
含义 |
$input_name |
输入域的名称 |
$input_value |
输入的值 |
$input_lable |
输入域的标记 |
$input_size |
输入域的大小 |
$input_maxlength |
输入域的最大长度 |
$input_type |
输入的类型 |
$input_format |
输入的格式 |
表13 Input对象的属性 |
方法名(函数) |
功能 |
My_Input |
自构函数,对象创建时被自动调用 |
set_size |
设置$input_size |
set_maxlength |
设置$input_maxlength |
get_name |
获得$input_name |
get_value |
获得$input_value |
get_lable |
获得$input_lable |
get_size |
获得$input_size |
get_maxlength |
获得$input_maxlength |
get_format |
获得$input_formant |
My_Type |
返回对象类别(I_AM_INPUT) |
Make_Element |
产生与Input对象相关的代码 |
表14 Input对象的方法 |
Input对象多了很多设置属性和获取属性的函数,这是为了其它函数的使用。Input对象的Make_Element对象的实现与以上对象大同小异,这里不再列举。
2.8 Select对象的实现
Select对象类似于HTML中的Radio和Checkbox,其包含的属性和方法如下表所示:
属性名称 |
含义 |
$select_name |
选择域的名称 |
$select_value |
选择域的值 |
$select_option |
选择域的选项 |
$option_number |
选项的数目 |
$select_multiple |
是否允许多选 |
$select_default |
默认值 |
表15 Select对象的属性 |
方法名(函数) |
功能 |
My_Select |
自构函数,对象创建时被自动调用 |
set_multiple |
设置允许多选 |
get_name |
获得$select_name |
get_value |
获得$select_value |
add_option |
加入新的选项 |
get_defaults |
获得$select_defaults,即获得默认值 |
My_Type |
返回对象类别(I_AM_SELECT) |
Make_Element |
产生与Select对象相关的代码 |
表16 Select对象的方法 |
在Select对象中,比较特殊的是add_option函数,该函数不仅实现添加选项,而且也根据入口参数,设定$select_default。由于单选和多选的$select_default不同,因此需要分开实现。对于多选,允许同时选择多个默认值值,这时默认值的格式为"默认值1;默认值2;默认值3;...."。关于add_option的代码如下所示:
//加入Option |
由于多数的工作已由add_option完成,因此get_defaults函数很简单,只需返回$select_default即可,代码如下所示:
//获得变量默认值 |
2.9 Do对象实现
我们这里定义的Do对象,主要完成Input、Select、Fieldset等元素的变量的传递,即当激发Do元素后,会将我们的输入和选择发送给服务器进行处理。Do对象的属性和方法如下表所示:
属性名称 |
含义 |
$do_name |
do的名称 |
$do_lable |
do的标记 |
$do_var |
do所要传递的变量 |
$do_url |
将变量发送到的地址 |
表17 Do对象的属性 |
方法名(函数) |
功能 |
My_Do |
自构函数,对象创建时被自动调用 |
set_var |
设置$do_var |
set_url |
设置$do_url |
get_name |
获得$do_name |
My_Type |
返回对象类别(I_AM_DO) |
Make_Element |
产生与Do对象相关的代码 |
表18 Do对象的方法 |
Do中Make_Element的实现需要开发人员对Do的组成比较了解,其中难点在代码的实现一般而言,代码的格式为: <go herf="发送到的地址?变量名1=$(变量值1)&变量名2=$(变量值2)&...... ">
针对的格式,Do对象的Make_Element函数的代码如下所示:
//产生Do部分的代码 |
2.10 Fieldset对象的实现
| |||||||||||||||||||||||||