使用PHP进行Wap开发

基础篇        *返回文章列表*

   

  WAP的发展离不开其WWW的底蕴,毕竟,整个WAP协议的制定参照了WWW的模型,并且尽可能地沿用了Internet的诸多标准和技术,如WML语言脱胎于HTMLXMLWMLScript与传统的脚本语言也很相似。的确,WAP虽然是个新名词,但是它却与传统的国际互联网密不可分地结合着,在结构上如此,在技术上更是如此。
  
  在WAP协议中提到WAP页面所使用的标记语言为WML,当需要进行较高级的操作,如使用终端机的某些资源时,可以使用WMLScript脚本语言,这两种语言很简单,甚至可以用简陋来形容,特别是它们对数据库的操作几乎无能为力,这种"缺陷"WAP广阔的商务和应用前景格格不入,但我们并不是无能为力的,由于WAPWWW的交融,我们仍然可以使用WWW的技术与资源来解决数据库的访问问题,因为毕竟多数数据库仍处于有线网络内。
  
  目前最流行的网页编程语言和数据库的搭配是什么?相信很多人会说出"PHP""MySQL"这两个名字。它们属于WWW或者有线互联网的范畴,由于使用方便与功能强大的特点而美名传播,那么它们能够为WAP服务吗?答案是肯定的。不熟悉WAP或者PHP的人或许有些不解,毕竟在传统意义上PHP提供的是WWW的内容与服务,对于WAP,它们能"兼容"吗?

PHP粗解        *返回文章列表*

   

  看了WAP的介绍,大家应该开始逐步理解PHP为何仍能为WAP服务了。PHPHTMLWMLJavascriptJava都不一样,它是在服务器端运行的,而JavascriptJava等都运行在浏览器端,相对于WAPWMLScript运行于客户机端,但是,以上的这些语言都可以很容易与PHP结合起来。   

  PHP具有很大的灵活性,在WWW中,它可以生成所需要的任何HTML代码,甚至Javascript代码。同样,在WAP中,我们仍然可以利用PHP这种动态、灵活的特点,生成任意的WML代码,这样,PHP自然能够为WAP服务。   
  
  之所以使用PHP来提供WAP服务,除了它灵活的特点外,还由于PHP可以方便的使用数据库。用户可以使用PHP存取OracleSybaseMS SQLMySQLdBaseInformix等任何支持ODBC标准的数据库,这点正好迎合了WAP商务的需求。   

  在实用中,一般需要建立PHP文件,当用户向服务器发出浏览该PHP文件的请求时,服务器将根据文件中的代码产生相应的HTMLWML内容,并发送给浏览器或WAP终端。   

  如想获取关于PHP的信息,可以前往http://www.php.com查看。

PHPWML

   

  PHP的系统平台、工作方式、安装方法,这些都不在本文的讨论范围内,毕竟我们的重点是PHP如何与WAP协作。一般而言,为了能让PHP工作,我们需要带有PHP模块的Web服务器,或者说支持PHP的服务器,Apache是世界上最流行的Web服务器,另外,我们还需要安装PHP软件以及如MySQL这样的数据库,具体内容可以查阅相关书籍或网站。下面我们讨论如何让PHP产生WML代码。
  
  在WWW中,PHP产生的第一行内容往往是: content-type: text/html
  
  
但是,WAP终端是读不懂这样的标题的。WAP终端从服务器下载的单位是Deck,浏览的单位是Card,一般一个Deck就组成一个WML文件。那么,为WAP服务时,PHP文件中往往需要包含如下的代码:

  header("Content-type:text/vnd.wap.wml");
  echo "<xml version=/"1.01">/n"
  echo"<! DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/"/"http://www.wapforum.org//DTD//wml_1.1.xml/">/n";


  以上三行代码产生了WML文件(Deck)的文件头,这样WAP终端就可以识别所下载的Deck是否WML格式,并且接着显示余下的Deck内容。
  
  下面是一个最简单的Deck,它在WAP终端上显示"Hello World"

 <?xml version="1.0" encoding="ISO-8859-1"?> <! DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org//DTD//wml_1.1.xml">
  </xml>
  <!--Nokia Parser Info:Phone = Nokia 7110; Height = 90; Width = 130; CurrentDeckSize = 38; MaxDeckSize = 1600; CardsOnEachLine = 5; CardsVerticalGap = 30-->
  </card id="card1" ordered="true" newcontext="false">
  <p align="left">
  Hello World
  </p>
  </card>
  </wml>


我们建立的相应的PHP文件如下:

<?php
  header("Content-type:text/vnd.wap.wml");
  echo "<?xml version=/"1.0/">/n";
  echo "<!DOCTYPE wml PUBLIC /"-//WAPFORUM//DTD WML 1.1//EN/" /"http://www.wapforum.org//DTD//wml_1.1.xml/">/n";
  echo "/n";
  echo "<!--Nokia Parser Info: Phone = Nokia 7110; Height = 90; Width = 130; CurrentDeckSize = 38; MaxDeckSize = 1600; CardsOnEachLine = 5; CardsVerticalGap = 30-->/n";
  echo "<card id=/"card1/" ordered=/"true/" newcontext=/"false/"> ";
  echo "<p align=/"left/">/n";
  echo "Hello World";
  echo "</p>";
  echo "</card>";
  echo "</wml>";
  ?>

  我们可以将该文件存为index.php3,当WAP终端浏览该网站时,Web服务器会自动根据index.php3的内容产生如上所列的WML内容,并发送给网关进行处理。WAP终端收到该Deck后,将会在显示屏上显示"Hello World"的字样。
  
  以上是关于PHPWAP中最简单的应用,它只是简单地产生若干行WML代码,并没有牵扯到数据库的访问。其实,PHP强大的功能可以为WAP提供很丰富的服务,而最值得挖掘的就是其强大的数据库支持,这些将在以后的文章中讨论。

进阶篇        *返回文章列表*

    

总体规划

实现 (1数据和函数定义  2对象实现 )

创建WAP页面

以后的工作

  附件

 


  PHP之于WAP,并不仅仅是靠几个"echo"语句向浏览器传送WML代码。PHPWAP中较高端的应用,自然会牵扯到PHP的数据库操作和有关面向对象的编程知识。PHP是支持面向对象(OOP)的,这增强了PHP开发的持续性和开放性。当我们开发WAP页面时,如果利用PHP的面向对象特性,将使得代码更加灵活,通用性更高,体系更完整,层次更清晰,重用性也有所增加。
  
  这里,我们将讲述如何利用面向对象的编程方法进行PHPWAP的开发。建议在阅读本之前先熟悉WML语法和PHP语法。

 

总体规划

    

  进行面向对象的编程自然需要确定对象以及对象之间的联系。对于需要开发的WAP页面,应该首先确定其中的模块或元素的种类,然后可以以种类为单位确定对象的个数。
  
  WAP浏览器下载的最小单位是Deck,一个Deck中可以包含若干个Card。为了简化设计,我们只考虑一个Card的情况。这样,DeckCard的一一对应关系使得我们可以只为它们建议一个对象(如果考虑一个Deck包含若干个Card时,则需要分别为DeckCard建立对象)。
  
  对于Card,其中可以包含文本(Test)、图象Image)、表格(Table)、输入(Input)、链接(Hyperlink)等元素,对于这些元素需要分别建立对象。
  
  在实用中,一般需要建立PHP文件,当用户向服务器发出浏览该PHP文件的请求时,服务器将根据文件中的代码产生相应的HTMLWML内容,并发送给浏览器或WAP终端。
  
  继续细化,对于表格(Table),为了方便管理,我们可以建立行(Row)对象,而每个行对象中会包含若干个单元(Cell)对象,这里的单元对象可以是文本,也可以是图象,因此不需要另外定义。另外,对于输入(Input)、选择(Select)、动作(Do)等与服务器端交互的元素,我们为它们定义了一个父对象(Interact),将它们包含起来,方便理解与编程。
  
  如图1是我们建立的各种对象,其中的方框表示对象,而连线则表示包含关系,上层的对象包含下层的对象。


1 PHP对象图


  对于具体对象的实现,需要遵循PHP的语法。对象中包含属性与方法,其中属性用来描述每个对象的特征,或者说,只要确定了属性,那么我们就确定了对象。对象中的方法描述了对象的操作,这些操作可以包括属性的设置、读取、显示等。因此,我们在实现以上所定义的对象时,需要提供完整的属性与必需的方法。
  
  举Deck的例子,如果要确定一个DeckCard),我们需要知道它内部的所有元素,这些元素就是我们定义过的ImageText等对象,因此Deck中应该包含有关这些对象的属性。另外,Deck还包含一些设置性的参数,如标题等,因此我们也可以为它定义"Title"属性等。就方法而言,我们所定义的对象中比较重要的方法是自构函数和创建函数。其中自构函数是指在创建一个对象(类)时所应完成的初始化,如设置标题头等;创建函数则产生有关该对象的WML代码,以组成一个完整的WML页面。在这里,面向对象的方法简化了创建函数,因为每个对象只用调用其属性(对象)的创建函数即可。如Deck对象要创建有关Table的代码时,则Deck中一定具有Table属性,那么直接调用Table的创建函数即可,同样,Table可以调用Row的创建函数,有些像对象的嵌套,这种机制无疑简化了开发过程。
  
  另外,对于Deck,由于它的属性可以是TextImageTableFormLink中的任一,它就需要确定其每个属性的类型,以进行相应的处理。为了实现这点,可以在每个对象中定义一个获得该对象类型的方法,该方法(函数)返回一个标识以供Deck确认,例如,对于Text,可以使其返回0,对于Image,可以使其返回1等。对于Interact对象,也存在着与Deck相同的问题。
  
  在编写代码的过程中,我们应该尽量保持代码的可读性和可维护性,因此应尽量少使用无确切含义的数字和标识。例如上面所定义的返回值01,就难以让人理解。为了解决这个问题,我们可以使用define函数,将数字与一个符号对应,例如我们可以I_AM_TEXT表示0I_AM_IMAGE表示1,从而增强了代码的可读性。
  
  对于所定义的对象,我们可以生成一个INC文件将其保存,供PHP文件调用以生成页面。这里需要明确一点,我们上面所述关于对象的实现并没有生成任何页面,它只是定义了我们生成页面所需要的元素和方法,而真正生成页面的工作是PHP文件完成的,它使用了我们所定义的元素。
  
  下面我们将讲述对象的具体实现。

  我们建立的相应的PHP文件如下:

 

实现 [TOP]

    

1.数据和函数定义 [TOP]

  在编写对象部分代码之前,我们需要进行准备工作,即定义必要的常量和函数。如上所述,为了提高代码的可读性,我们使用"define"语句定义了一系列常量,这些常量将在对象实现的代码中被引用。

 //定义对象类型
  define("I_AM_TEXT",0); //文本
  define("I_AM_IMAGE",1); //图象
  define("I_AM_TABLE",2); //表格
  define("I_AM_FIELDSET",3); //交互元素
  define("I_AM_HYPERLINK",4); //链接
  define("I_AM_INPUT",5); //输入
  define("I_AM_SELECT",6); //选择
  define("I_AM_DO",7); //动作
  define("I_AM_ROW",8); //

  //定义默认参数
  define("DEFAULT_TITLE","Welcome");//默认标题

  //定义页面格式
  define("ALIGN_LEFT",1); //居左
  define("ALIGN_RIGHT",2); //居右
  define("ALIGN_CENTER",3); //居中

  //定义文字格式
  define("TEXT_NORMAL",0); //普通
  define("TEXT_BOLD",1); //加粗
  define("TEXT_UNDERLINE",2); //下划线
  define("TEXT_ITALIC",4); //斜体
  define("TEXT_BIG",8); //大字体
  define("TEXT_SMALL",16); //小字体

  //定义Input元素类型
  define("INPUT_TEXT",0); //普通文本
  define("INPUT_PASSWORD",1); //密码

  //定义Select元素类型
  define("SELECT_NOT_MULTIPLE",0);//单选
  define("SELECT_MULTIPLE",1);//多选

  //定义Select元素选项的默认值
  define("SELECT_NOT_CHECKED", 0);
  define("SELECT_CHECKED", 1);

  除了以上的常量定义外,我们还需要定义函数"convert_character"。对于一些WML语言保留字符如"&""<"">"等,以及ASCII码值大于160的符号,如果需要在浏览器端显示则必需进行处理。对于"<"等保留字符,需要将它们转化为"<"的格式,对于大于161的符号,需要将它们转化为"&#x;"(其中x表示符号的ASCII码值)的格式。由于定义了该函数,那么程序后面需要用到此功能时(事实证明经常用到)直接调用该函数即可。
  
  该函数的实现如下:

 //本函数实现特殊字符的转换
  //入口参数:字符串$words
  //出口参数:字符串&convert_ok
  function convert_character($words)
  {
  //WML语言保留字符如"<"等转化为"<"格式
  $convert_words=htmlspecialchars($words);
  //"m"ASCII码大于160的字符转化为"&#x;"x为其ASCII码值)的形式 for ($i=0; $i <strlen ($convert_words); $i++)
  {
  if (ord(substr($convert_words, $i, 1)) >= 160)
   $convert_ok.="&#".ord(substr($convert_words,$i,1)).";";
  else
   $convert_ok.=substr($convert_words,$i,1);   
  }

  //返回转换后的字符串
  return($convert_ok);
  }

 
        

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所包含的元素,如TextTable

$element_number

Card中所包含的元素数目

$default_item

变量及其默认值数组

$default_number

默认值数组元素数目

1 Deck对象的属性

接着确定Deck对象的方法,如表2所示。

方法名(函数)

功能

My_Deck

自构函数,对象创建时被自动调用

Add_Element

加入元素,如TextImageTableHyperlinkInputSelectDo

Make_Deck

建立Deck关键的函数,它将最终产生需要的Deck

2 Deck对象的方法

  在我们所定义的函数中,比较复杂的是Add_Element函数和Make_Deck函数。
  
  Add_Element函数的入口参数为任何一种所定义的元素,如TextImage等。函数开始先进行入口参数的检查,判断是否为合法对象,这种检查还会经常出现在后续的对象实现中。如果检查入口参数不是对象,则将出错退出。接下来判断入口参数是否为我们已经定义过的对象种类,如果是,则将其假如到card_element属性中,并使element_number计数器加1。如果入口参数是无法识别的对象,则程序报错退出。
  Make_Deck函数很复杂,我们按以下步骤实现:
  1.发送标头;
  2.产生Deck头代码;
  3.利用相应对象封装的get_defaults函数获取某些元素,如SelectFieldset等中的变量的默认值(如果存在);
  4.如果缺省值存在,列出与缺省值相关的代码,即进入页面后自动刷新相应变量为缺省值;
  5.设置页面格式;
  6.对Deck中包含的每一个对象调用其封装的Make_Element函数产生各自的代码;
  7.产生Deck结束代码。
  
  虽然我们在此列出的步骤很简单,但是具体的实现却牵扯到很多细节,而这些实现需要编程人员对WML语言比较了解,特别是对DeckCard的构造很熟悉。下面列出了其中比较复杂的获取变量默认值部分的代码和创建各元素部分代码的源程序,这两个部分体现了PHP语言面向对象编程的特点。

 //获取交互元素如InputSelect的一些变量默认值
  while(list($thekey,$thevalue)=each($this->card_element))
  {
  switch($thevalue->My_Type())
  {
  case I_AM_SELECT:
  case I_AM_FIELDSET:
  {
  $temp_element=$thevalue;

  $temp_default=$temp_element->get_defaults();
  
  
if($temp_default)
  {
   $this->default_item[$this->default_number]=$temp_default;

   $this->default_number++;
   break;
   }
   default:
   {
   break;
   }
  }
  }

 //产生相关元素各部分的代码
   for($i=0;$i<$this->element_number;$i++)
   {
   $the_element = $this->card_element[$i];
   switch ($the_element->My_Type())
   {
   case I_AM_TEXT:
   case I_AM_IMAGE:
   case I_AM_TABLE:
   case I_AM_HYPERLINK:
  case I_AM_INPUT:
  case I_AM_SELECT:
  case I_AM_DO:
  case I_AM_FIELDSET:
    {
    $temp_element = $this->card_element[$i];
 
    $temp_element->Make_Element(&$this);

    break;
   }
   default:
  {
  break;
  }
  }
  }

  由于篇幅原因,细节实现不在此讨论,读者可以参阅所附的代码。

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部分代码
  function Make_Element($deck)
  {
  if ($this->attribute & TEXT_BOLD)
  echo "<b>/n";

   if ($this->attribute & TEXT_UNDERLINE)
  echo "<u>/n";

  if ($this->attribute & TEXT_ITALIC)
  echo "<i>/n";

  if ($this->attribute & TEXT_BIG)
  echo "<big>
/n";
  
  
if ($this->attribute & TEXT_SMALL)
  echo "<small>/n";

  if ($this->text)
  printf("%s/n", convert_character($this->text));

  if ($this->attribute & TEXT_SMALL)
  echo "</small>/n";

  if ($this->attribute & TEXT_BIG)
   echo "</big>/n";

  if ($this->attribute & TEXT_ITALIC)
  echo "</i>/n";

  if ($this->attribute & TEXT_UNDERLINE)
  echo "</u>/n";

  if ($this->attribute & TEXT_BOLD)
   echo "</b>/n";

  $br_command = "<br/>/n";
  for ($i=0; $i<$this->br_count; $i++)
  echo $br_command;
  }

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页面

常量定义部分

函数定义部分

对象声明部分


常量定义部分

//定义对象类型
  define("I_AM_TEXT",0); //文本
  define("I_AM_IMAGE",1); //图象
  define("I_AM_TABLE",2); //表格
  define("I_AM_INTERFACE",3); //交互元素
  define("I_AM_HYPERLINK",4); //链接
  define("I_AM_INPUT",5); //输入
  define("I_AM_SELECT",6); //选择
  define("I_AM_DO",7); //动作
  define("I_AM_ROW",8); //

  //默认参数
  define("DEFAULT_TITLE""Welcome")

  //定义页面格式
  define("ALIGN_LEFT",1); //居左
  define("ALIGN_RIGHT",2); //居右
  define("ALIGN_CENTER",3); //居中

  //定义文字格式
  define("TEXT_NORMAL",0); //普通
  define("TEXT_BOLD",1); //加粗
  define("TEXT_UNDERLINE",2); //下划线
  define("TEXT_ITALIC",4); //斜体
  define("TEXT_BIG",8); //大字体
  define("TEXT_SMALL",16); //小字体

  //定义Input元素类型
  define("INPUT_TEXT",0); //普通文本
  define("INPUT_PASSWORD",1); //密码

  //定义Select元素类型
  define("SELECT_NOT_MULTIPLE",0);//单选
  define("SELECT_MULTIPLE",1);//多选

  //定义Select元素选项的默认值
  define("SELECT_NOT_CHECKED", 0);
  define("SELECT_CHECKED", 1);


函数定义部分 [TOP]

  //本函数实现特殊字符的转换
  //入口参数:字符串$words
  //出口参数:字符串&convert_ok
  function convert_character($words)
   {
  //WML语言保留字符如"<"等转化为"<"格式
  $convert_words=htmlspecialchars($words);

  //"m"ASCII码大于160的字符转化为" "x为其ASCII码值)的形式
  for ($i=0; $i<strlen($convert_words); $i++)
  {
  if (ord(substr($convert_words, $i, 1)) >= 160)
    $convert_ok.="&#".ord(substr($convert_words,$i,1)).";";
   else
    $convert_ok.=substr($convert_words,$i,1);
    }

   //返回转换后的字符串
   return($convert_ok);

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对象方法


  表格对象与TextImage对象不太一样,它其中还包含了子对象Row,所以它创建代码时会调用子对象RowMake_Element函数。TableMake_Element函数代码如下所示:

 //创建Table部分代码
  function Make_Element($deck)
  {
  $max_column_number = 0;
  for ($i = 0; $i < $this->row_number; $i++)
   {
  $the_row = $this->table_row[$i];
  $column_number = $row->get_column_number();
  if ($column_number > $max_column_number)
  $max_column_number = $column_number;
  }
  printf("<table columns=/"%d/">/n", $max_column_number);
  for ($i = 0; $i < $this->row_number; $i++)
  {
  $the_row = $this->table_row[$i];
  $the_row->Make_Element(&$deck);
   }

   echo "</table></br>/n";
  }


2.5 Row
对象的实现 [TOP]
  Row对象是Table对象的属性之一,它所包含的属性与方法如下表所示:

属性名称

含义

$column

行所包含的单元格,是一个数组,元素值可为TextImage对象

$column_number

行所包含的单元格数目

9 Row对象的属性

方法名(函数)

功能

My_Row

自构函数,对象创建时被自动调用

Add_Element

加入单元格

get_column_number

返回单元格数目

My_Type

返回对象类别(I_AM_ROW

Make_Element

产生与Row对象相关的代码

10 Row对象的方法


  由于Row所包含的单元格也是我们所定义的TextImage等对象,因而在创建其代码是会调用TextImage对象的Make_Element函数。
  
  "Deck--Table--Row--TextImage",这种包含关系体现了面向对象的编程观点,条理清晰,降低了设计难度。

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中的RadioCheckbox,其包含的属性和方法如下表所示:

属性名称

含义

$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
  function add_option($label, $value,$checkit=SELECT_NOT_CHECKED)
  {
  if (!$label || !$value)
    die("Incorrect option,Quit");

   $this->select_option[$this->option_number]["label"] = $label;
   $this->select_option[$this->option_number]["value"] = $value;

   if(!$this->select_multiple)
  {
  if($this->select_value==""||$checkit)
  {
  $this->select_value=value;
  $this->select_default ["name"]=$this->select_name;
  $this->select_default ["value"]=$this->select_value;
   }
  }
  else
  {
  if($checkit)
  {
  if($this->select_value=="")
   $this->select_value=$value
  else
   $this->select_value.=";".$value;
  $this->select_default ["name"]=$this->select_name;
  $this->select_default ["value"]=$this->select_value;
   }
  }
  $this->option_number++;
 }

  由于多数的工作已由add_option完成,因此get_defaults函数很简单,只需返回$select_default即可,代码如下所示:

 //获得变量默认值
  function get_defaults()
  {
  return $this->select_default;
  }

2.9 Do对象实现
  我们这里定义的Do对象,主要完成InputSelectFieldset等元素的变量的传递,即当激发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对象的方法


  DoMake_Element的实现需要开发人员对Do的组成比较了解,其中难点在代码的实现一般而言,代码的格式为: <go herf="发送到的地址?变量名1=$(变量值1)&变量名2=$(变量值2)&...... ">
  
  
针对的格式,Do对象的Make_Element函数的代码如下所示:

//产生Do部分的代码
  function Make_Element($deck)
  {
  while (list($key, $value) = each($this->do_var))
    $the_var.= $value."=$(".$value.")&";

  if ($this->do_name != "")
  $the_var.=$this->do_name."=".$this->do_label;

  if (substr($the_var, -5) == "&")
  $the_var = substr($the_var, 0, strlen($the_var)-5);

  printf("/n", $this->do_label);
  printf("/n", $this->do_url, $the_var);

  echo "/n";
  echo "/n";
  }

2.10 Fieldset对象的实现
  Fieldset对象比较特殊,它将TextImageInput等其它元素组织在一起,以便于浏览器显示。因此Fieldset对象在某些实现方法上与Deck相同。Fieldset对象的属性与方法如下表所示:

属性名称

含义

$fieldset_title

fieldset的标题

$fieldset_element

fieldset所包含的元素

$element_number

fieldset所包含的元素的数目

19 Fieldset对象的属性

方法名(函数)

功能

My_Fieldset

自构函数,对象创建时被自动调用

Add_Element

加入新元素

get_defaults

获取变量默认值

My_Type

返回对象类别(I_AM_FIELDSET

Make_Element

产生与Fieldset对象相关的代码

20 Fieldset对象的方法

  在Fieldset所包含的函数中,除get_defaultsMy_Type之外,其它的实现方法同Deck对象基本相同,这是由于两者的结构类似的缘故。但是Fieldset毕竟是Deck对象的一部分,因此它还需要向Deck对象传送一些参数。
  
  Fieldsetget_defaults函数的实现方法也利用了面向对象的特点,它调用其元素Selectget_defaults函数从而获得默认值,该部分代码如下所示:

//获取变量默认值
   function get_defaults()
  {
  $i = 0;
  while (list($key, $value) = each($this->fieldset_element))
  {
  switch ($value->My_Type())
   {
  case I_AM_SELECT:
   {
   if($value->get_defaults())
  {
  $temp_default=$value->get_defaults();
  $fieldset_default[$i]=$temp_default;
  $i++;
   }
  }
   break;
  }
  default:
  {
    break;
   }
   }
    }
  return fieldset_default;
   }

  以上是关于所有对象的实现,需要注意的是,代码中我们所定义的对象名称为"My_对象名"的格式,如Text对象的名称为"My_Text"
  
  以上我们所定义的对象全部包含在了文件"my_wap.inc"中,以供php文件调用。

创建WAP页面 [TOP]

   

  我们将利用"my_wap.inc"文件来创建WAP页面。我们需要建立一个文件"my_wap.php3",当浏览器访问该文件时,它将产生WML代码,发送到浏览器并显示出来。该部分代码如下所示:

<?php
  
  //本代码获取用户输入,并在用户确认后发出欢迎信息

  require( "my_wap.inc");//包含所定义的各种对象
  $Demo_Card = new My_Deck( "Introduce Yourself");//建立一个Deck对象

  $Demo_Text = new My_Text("Welcom to my home",TEXT_BOLD); //建立文本
  $Demo_Text->set_br_count(1); //文本后加入1个空行

  $Demo_Card->Add_Element($Demo_Text);//加入该文本

  if (!$submit)//如果未点击过submit
  {

  $Demo_Input = new My_Input( "yourname", "", "Your Name", "*M");//建立一个Input对象
  $Demo_Input->set_size(10);
  $Demo_Input->set_maxlength(10);

  $getvar[0]="yourname";
  $Demo_Do = new My_Do( "submit", "Submit",$getvar,"$PHP_SELF");//建立一个Do对象

  $Demo_Card->Add_Element($Demo_Input);//加入Input对象
  $Demo_Card->Add_Element($Demo_Do);//加入Do对象

  $Demo_Card->Make_Deck();//创建页面
  }
  else //如果已经点击过submit
  {
   $Demo_Text2 = new My_text("Nice to meet you,$yourname"); //建立文本
   $Demo_Card->Add_Element($Demo_Text2);//加入该文本
   $Demo_Card->Make_Deck();//创建页面
  }
  
  
?>


  我们可以看到,当用户第一次进入该页面时,将进入"If"语句的第一个分支,在那里显示了一个Input域,用户输入自己的姓名后,点击Do元素"Submit"。之后"$submit"将被置为有值("Submit"),并将"$getvar"中的变量发送给页面"$PHP_SELF",这里"$PHP_SELF"PHP环境变量,表示本页面。因此用户点击"Submit"后,重新进入了该页面,但由于此时"$submit"变量不为0,因此用户进入"If"语句的第2个分支。在这里,程序将用户名字显示出来,并发出欢迎信息。

以后的工作 [TOP]

   

  以上的代码实现了通过PHP动态创建WAP页面的功能,并且利用了面向对象的方法,将各元素进行了封装,进行有层次的开发,隐藏了WML语言的细节,增加了灵活性,简化了页面的创建。
  
  今后,我们还可以继续维护代码,由于我们采用了面向对象编程方法,当我们需要增加新功能时,并不用对代码进行太多修改。
  
  我们可以将目前的"My_Deck"类改为"My_Card"类,而创建一个新类"My_Deck",从而实现一个Deck中包含多个Card
  
  另外,我们可以根据PHP的环境变量的一些环境变量,判断用户的浏览器类型,从而动态产生HTML页面或者WML页面,使得各种终端用户都可访问本站点。
  
  如果服务器上安装了MySQL等数据库,那么PHPMySQL的搭配更会使得程序开发如虎添翼,这样就可以在WAP页面中增加更多的功能和服务。
  
  以上这些我们可以留待以后分析。

本代码定义了PHP库,用于创建WAP页面

常量定义部分

函数定义部分

对象声明部分


常量定义部分

//定义对象类型
  define("I_AM_TEXT",0); //文本
  define("I_AM_IMAGE",1); //图象
  define("I_AM_TABLE",2); //表格
  define("I_AM_INTERFACE",3); //交互元素
  define("I_AM_HYPERLINK",4); //链接
  define("I_AM_INPUT",5); //输入
  define("I_AM_SELECT",6); //选择
  define("I_AM_DO",7); //动作
  define("I_AM_ROW",8); //

  //默认参数
  define("DEFAULT_TITLE""Welcome")

  //定义页面格式
  define("ALIGN_LEFT",1); //居左
  define("ALIGN_RIGHT",2); //居右
  define("ALIGN_CENTER",3); //居中

  //定义文字格式
  define("TEXT_NORMAL",0); //普通
  define("TEXT_BOLD",1); //加粗
  define("TEXT_UNDERLINE",2); //下划线
  define("TEXT_ITALIC",4); //斜体
  define("TEXT_BIG",8); //大字体
  define("TEXT_SMALL",16); //小字体

  //定义Input元素类型
  define("INPUT_TEXT",0); //普通文本
  define("INPUT_PASSWORD",1); //密码

  //定义Select元素类型
  define("SELECT_NOT_MULTIPLE",0);//单选
  define("SELECT_MULTIPLE",1);//多选

  //定义Select元素选项的默认值
  define("SELECT_NOT_CHECKED", 0);
  define("SELECT_CHECKED", 1);


函数定义部分 [TOP]

  //本函数实现特殊字符的转换
  //入口参数:字符串$words
  //出口参数:字符串&convert_ok
  function convert_character($words)
   {
  //WML语言保留字符如"<"等转化为"<"格式
  $convert_words=htmlspecialchars($words);

  //"m"ASCII码大于160的字符转化为" "x为其ASCII码值)的形式
  for ($i=0; $i<strlen($convert_words); $i++)
  {
  if (ord(substr($convert_words, $i, 1)) >= 160)
    $convert_ok.="&#".ord(substr($convert_words,$i,1)).";";
   else
    $convert_ok.=substr($convert_words,$i,1);
    }

   //返回转换后的字符串
   return($convert_ok);

对象声明部分

1.Deck对象声明

2.Text对象声明

3.Image对象声明

4.Table对象声明

5.Row对象声明

6.Hyperlink对象声明

7.Input对象声明

8.Select对象声明

9.Do对象声明

10.Fieldset对象声明

  


1.Deck
对象声明 [TOP]

class My_Deck
   {
  //属性声明
  var $card_title;
  var $card_alignment;
  var $element_number;
  var $default_item;
  var $default_number;

  //自构函数
  function My_Deck($title=DEFAULT_TITLE, $align=ALIGN_LEFT)
  {
  if ($title != DEFAULT_TITLE)
   $this->card_title = $title;

   $this->align = $alignment;
   $this->card_timer = 0;
   $this->forward_url = "";

   $this->element_number = 0;
   $this->default_number = 0;
  }

  //添加元素
  function Add_Element($element)
  {
  if (!is_object($element))
    die("Unlegal Element,Quit");
  switch($element->My_Type())
   {
  case I_AM_TEXT:
  case I_AM_IMAGE:
  case I_AM_TABLE:
  case I_AM_HYPERLINK:
  case I_AM_INPUT:
  case I_AM_SELECT:
  case I_AM_DO:
  case I_AM_FIELDSET:
   {
    $this->card_element[$this->element_number] = $element;

   $this->element_number++;

    break;
    }
   default:
    {
    die("Unlegal Element,Quit");
    }
    }
   }
  
  
//创建Deck
   function Make_Deck()
  {
  header("content-type: text/vnd.wap.wml");

   echo "<?xml version=/"1.0/"?>/n";
   echo "<!DOCTYPE xml PUBLIC /"-//WAPFORUM//DTD WML 1.2//EN/" /"http://www.wapforum.org/DTD/wml_1.1.xml/">/n";
   printf("<-- Generated by %s %s -->/n", HAW_VERSION, HAW_COPYRIGHT);

   echo "

<wml>/n";

   $title = "title=/"$this->title/"";

   printf("<card%s>/n", $title);

  //获取交互元素如InputSelect的一些变量默认值
  while(list($thekey,$thevalue)=each($this->card_element))
  {
  switch($thevalue->My_Type())
  {
   case I_AM_SELECT:
   case I_AM_FIELDSET:
   {
   $temp_element=$thevalue;

   $temp_default=$temp_element->get_defaults();

   if($temp_default)
    {
    $this->default_item[$this->default_number]=$temp_default;

    $this->default_number++;

    break;
    }
    default:
     {
    break;
     }
   }
  }

  if ($this->default_number)
   {
   //缺省值存在
   echo "<onevent type=/"onenterforward/">/n";
   echo "/n";

  // 列出缺省值
  for($i=0;$i<$this->default_number;$i++)
  {
  while (list($thekey, $thevalue) = each($this->default_item[$i]))
  printf("<setvar name=/"%s/" value=/"%s/"/>/n", $thevalue["name"], $thevalue["value"]);
    }

  echo "</refresh>/n";
  echo "</onevent>/n";

  //后向进入页面时变量默认值也需重新设置,实现方法与以上相同
  echo "<onevent type=/"onenterbackward/">/n";
  echo "<refresh>/n";

  // 列出缺省值
  for($i=0;$i<$this->default_number;$i++)
   {
  while (list($thekey, $thevalue) = each($this->default_item[$i]))
  printf("<setvar name=/"%s/" value=/"%s/"/>/n", $thevalue[name], $thevalue[value]);
   }
  echo "</refresh>/n";
  echo "</onvent>/n";
  }

  //设置页面格式
  switch ( $this->card_align )
  {
  case ALIGN_LEFT:
   {
   echo "</p>/n";
   break;
   }

  case ALIGN_CENTER:
  {
  echo "<p align=/"center/"> /n";
  break;
   }

  case ALIGN_RIGHT:
  {
  echo "<p align=/"right/"> /n";

  break;
  }
  }

  for($i=0;$i<$this->element_number;$i++)
  {
   $the_element = $this->card_element[$i];
   switch ($the_element->My_Type())
    {
    case I_AM_TEXT:
    case I_AM_IMAGE:
    case I_AM_TABLE:
    case I_AM_HYPERLINK:
  case I_AM_INPUT:
  case I_AM_SELECT:
  case I_AM_DO:
  case I_AM_FIELDSET:
    {
    $temp_element = $this->card_element[$i];
 
    $temp_element->Make_Element(&$this);

    break;
    }
   default:
   {
   break;
   }
    }
   }

  echo " </p>/n"
  echo "</card> /n";
  echo "</wml> /n";

  };

2.Text对象声明

class My_Text
  {
  //属性声明
   var $text;
   var $attribute;
   var $br_count;//空行数目

  //方法声明
  
  
//自构函数
  function My_Text($the_text, $the_attribute=TEXT_NORMAL)
  {
   $this->text = $the_text;
   $this->attribute = $the_attribute;
   $this->br_count = 1;
  }

  //设置空行数目函数
  function set_br_count($the_br_count)
  {
   if (!is_int($the_br_count) || ($br < 0))
    die("incorrect br_count");

   $this->br_count = $the_br_count;
  }

  //返回对象类型函数
   function My_Type()
  {
  return I_AM_TEXT;
  }

  //创建Text部分代码
  function Make_Element($deck)
  {
   if ($this->attribute & TEXT_BOLD)
    echo "<b>n";

   if ($this->attribute & TEXT_UNDERLINE)
    echo "<i>n";

  if ($this->attribute & TEXT_BIG)
    echo "<big>
/n";

   if ($this->attribute & TEXT_SMALL)
   echo "<small>
/n";

  if ($this->text)
   rintf("%s/n", convert_character($this->text));

  if ($this->attribute & TEXT_SMALL)
   echo "</small>
/n";

  if ($this->attribute & TEXT_BIG)
   echo "</bigl>
/n";

  if ($this->attribute & TEXT_ITALIC)
   echo "</i>
/n";

  if ($this->attribute & TEXT_UNDERLINE)
   echo "</u>
/n";

  if ($this->attribute & TEXT_BOLD)
   echo "</b>
/n";

   $br_command = "<br/>/n";
  for ($i=0; $i<$this->br_count; $i++)
   echo $br_command;


3.Image
对象声明 [TOP]

class My_Image
  {
  //属性声明
  var $wbmp_url;
  var $alt_text;
  var $br_count;//空行数目

  //方法声明

  //自构函数
  function My_Image($url, $text)
  {
   $this->wbmp_url = $url;
   $this->alt_text = $text;
   $this->br_count = 0;
   }

  //设置空行数目
  function set_br_count($count)
  {
   if (!is_int($count) || ($count < 0))
    die("incorrect br_count,Quit");

   $this->br_count = $count;
  }

  //返回对象类型
  function My_Type()
  {
   return I_AM_IMAGE;
   }
  
  
//创建Image部分代码
  function Make_Element($deck)
  {
   printf("<image src=/"%s/" alt=/"%s/"/>/n", $this->wbmp_url, $this->alt_text);

  $br_command = "<br/>/n";
  for ($i=0; $i < $this->br_count; $i++)
    echo $br_command;
    } 
   }
   }

4.Table对象声明 [TOP]

class My_Table
  {
  //属性声明
  var $table_row;
  var $row_number;

  //方法声明

  //自构函数
  function My_Table()
  {
   $this->row_number = 0;//初始化为0
   }

  //加入新行
  function add_row($new_row)
  {
   if (!is_object($new_row)||$new_row->My_Type()!=I_AM_ROW)
    die("incorrect row,Quit");

  $this->table_row[$this->row_number] = $new_row;

  $this->row_number++;

   }

  //返回对象类型
  function My_Type()
   {
   return I_AM_TABLE;
   }

   //创建Table部分代码
   function Make_Element($deck)
   {
   $max_column_number = 0;
   for ($i = 0; $i < $this->row_number; $i++)
    {
    $the_row = $this->table_row[$i];
    $column_number = $row->get_column_number();
    if ($column_number > $max_column_number)
     $max_column_number = $column_number;
     }

    printf("<table columns=/"%d/">/n", $max_column_number);
   for ($i = 0; $i < $this->row_number; $i++)
    {
    $the_row = $this->table_row[$i];
    $the_row->Make_Element(&$deck);
    }

     echo "</table><br/>/n";
     }
    };


5.Row
对象声明 [TOP]

 {
  //属性声明
  var $column;
  var $column_number;

   //方法声明

  //自构函数
  function My_Row()
  {
    $this->column_number = 0;//初始化为0单元
  }
  //加入单元
  function Add_Element($cell_element=NULL)
  {
   if (is_object($cell_element))
   {
   if (($cell_element->My_Type() == HAW_PLAINTEXT) ||
     ($cell_element->My_Type() == HAW_IMAGE))
    {
   $this->column[$this->column_number]=$cell_element;
   $this->column_number++;
   }
  else
   die("Incorrect column,Quit");
    }

   if ($cell_element==NULL)
   {
   $this->column[$this->column_number]=$cell_element;
   $this->column_number++;
    }

   }

  //获取单元数目
   function get_column_number()
   {
    return $this->column_number;
   }

   //返回对象类型
   function My_Type()
   {
    return I_AM_ROW;
    }

    //创建Row部分代码
     function Make_Element($deck)
    {
     echo "<tr>/n";

    for ($i = 0; $i < $this->column_number; $i++)

    {
    echo "<td>/n";

    $the_column = $this->column[$i];
    if (is_object($the_column))
     $the_column->Make_Element(&$deck);

    echo "</td>/n";
    }
   
    echo "</tr>/n";
     }
   };

6.Hyperlink对象声明

class My_Hyperlink
  {
   //属性声明
   var $link_label;
   var $link_url;

   //方法声明

   //自构函数
   function My_Hyperlink($label, $url)
   {
    $this->link_label = $label;
    $this->link_url = $url;
    }

   //返回对象类型
   function My_Type()
   {
    return I_AM_HYPERLINK;
   }

   //创建Hyperlink部分代码
   function Make_Element($deck)
   {
   printf"<a herf=/"%s/">%s</a><br/>/n", convert_character($this->link_url), convert_character($this->link_label));
   }
  };


7.Input
对象声明 [TOP]

class My_Input
  { 
   //属性声明
   var $input_name;
  var $input_value;
  var $input_label;
  var $input_size;
  var $input_maxlength;
  var $input_type;
  var $input_format;

  //方法声明
  
  
//自构函数
   function My_Input($name, $value, $label, $type=INPUT_TEXT, $format="*M")
   $this->input_name = $name;
   $this->input_value = $value;
   $this->input_label = $label;
   $this->input_format = $format;
   $this->type = $type;
   }

    //设定大小
   function set_size($size)
   {
   $this->input_size = $size;
    }
    //设定最大长度
    function set_maxlength($maxlength)
    {
    $this->input_maxlength = $maxlength;
     }

   //返回名称
    function get_name()
   {
    return $this->input_name;
    }

   //返回值
   function get_value()
   {
   return $this->input_value;
    }

   //返回标签
   function get_label()
   {
   return $this->input_label;
    }

   //返回大小
    function get_size()
   {
    return $this->input_size;
   }
   
   //返回最大长度
   function get_maxlength()
   {
    return $this->input_maxlength;
   }

   //返回类型
    function get_type()
   {
   return $this->input_type;
    }

    //返回格式
   function get_format()
   {
    return $this->input_format;
    }

   //返回对象类型
   function My_Type()
   {
     return I_AM_INPUT;
   }

   //创建Input部分代码
   function Make_Element($deck)
    {
   if ($this->input_type == INPUT_TEXT)
    $type = "type=/"text/"";
   else
    $type = "type=/"password/"";

    if ($this->input_size)
      $size = sprintf("size=/"%d/"", $this->input_size);

   if ($this->input_maxlength)
     $maxlength = sprintf("maxlength=/"%d/"", $this->input_maxlength);
   
    printf("%s:<input format=/"%s/" %s name=/"%s/" value=/"%s/" %s %s/>/n",
        convert_character($this->input_label), $this->input_format, $type,
       $this->input_name,$this->input_value, $size, $maxlength);
     }
   };

8.Select对象声明

 class My_Select
   {
   //属性声明
   var $select_name;
   var $select_value;
   var $select_option;
   var $option_number;
   var $select_multiple;
   var $select_default

   //方法声明

   //自构函数
   function My_Select($name)
   {
   $this->select_name = $name;
     $this->select_value="";
   $this->option_number = 0;//初始化为空
   $select_multiple = SELECT_NOT_MULTIPLR;//初始化为单选
   }

   //设置多选
   function set_multiple()
   {
    $this->select_multiple=SELECT_MULTIPLE;
    }

   //返回名称
   function get_name()
   {
    return $this->select_name;
   }
   
   //返回值
   function get_value()
   {
   return $this->select_value;
    }

   //加入Option
   function add_option($label, $value,$checkit=SELECT_NOT_CHECKED)
   {
    if (!$label || !$value)
     die("Incorrect option,Quit");

    $this->select_option[$this->option_number]["label"] = $label;
    $this->select_option[$this->option_number]["value"] = $value;

    if(!$this->select_multiple)
    {
    if($this->select_value==""||$checkit)
     {
      $this->select_value=value;
     $this->select_default["name"]=$this->select_name;
     $this->select_default["value"]=$this->select_value;
     }
      }
      else
      {
     if($checkit)
      {
     if($this->select_value=="")
      $this->select_value=$value
     else
      $this->select_value.=";".$value;
     $this->select_default["name"]=$this->select_name;
     $this->select_default["value"]=$this->select_value;
     }
    }
   $this->option_number++;
    }

   //获得变量默认值
   function get_defaults()
   {
   return $this->select_default;
   }
   
   //返回对象类型
   function My_Type()
   {
    return I_AM_SELECT;
    }

   function Make_Element($deck)
   {
   if($select_multiple)
   printf("<selesct name=/"%s/" multiple=/"true/">/n", $this->select_name);
    else
   printf("<select name=/"%s/">/n", $this->select_name);

   while (list($key, $value) = each($this->select_option))
     {
      printf("<option value=/"%s/">%s/n",
           $value["value"], convert_character($value["label"]));
     }

    echo "/n";
   
    }
   };

9.Do对象声明

class My_Do
   {
   //属性声明
   var $do_name;
   var $do_label;
   var $do_var;
   var $do_url;

   //方法声明

   //自构函数

   function My_Do($name="",$label,$var,$url)
   {
    $this->do_name = $name;
    $this->do_label = $label;
    $this->do_var = $var;
    $this->do_url = $url;
   }
   
   //设置do_var
   function set_var($var)
   {
   $this->do_var=$var;
    }

   //设置do_url
   function set_url($url)
   {
    $this->do_url=$url;
   }

    //返回名称
   function get_name()
   {
     return $this->do_name;
   }

   //返回标签
   function get_label()
   {
    return $this->do_label;
   }

   //返回对象类型
   function My_Type()
   {
    return I_AM_DO;
    }

   //产生Do部分的代码
   function Make_Element($deck)
   {
   while (list($key, $value) = each($this->do_var))
    $the_var.= $value."=$(".$value.")&";
   
   if ($this->do_name != "")
    $the_var.=$this->do_name."=".$this->do_label;

   if (substr($the_var, -5) == "&")
     $the_var = substr($the_var, 0, strlen($the_var)-5);

   printf("/n", $this->do_label);
   printf("/n", $this->do_url, $the_var);

   echo "/n";
   echo "/n";
   }
  };

10.Fieldset对象声明

  class My_Fieldset
  {
   //属性声明
   var $fieldset_title;
   var $fieldset_element;
   var $element_number;

  //方法说明

  //自构函数
  function My_Fieldset($title)
  {
   $this->fieldset_title = $title;
   $this->element_number = 0;
  }

   //添加元素
  function Add_Element($element)
  {
   if (!is_object($element))
   die("Unlegal Element,Quit");

   switch($element->My_Type())
   {

    case I_AM_TEXT:
    case I_AM_IMAGE:
    case I_AM_TABLE:
    case I_AM_HYPERLINK:
    case I_AM_INPUT:
    case I_AM_SELECT:
   case I_AM_DO:
    {
     $this->fieldset_element[$this->element_number] = $element;

    $this->element_number++;

    break;
   }
    default:
   {
   die("Unlegal Element,Quit");
   }
  }
 }
   
   //获取变量默认值
   function get_defaults()
   {
    $i = 0;
    while (list($key, $value) = each($this->fieldset_element))
    {
     switch ($value->My_Type())
     {
     case I_AM_SELECT:
      {
      if($value->get_defaults())
     {
     $temp_default=$value->get_defaults();
     $fieldset_default[$i]=$temp_default;
     $i++;
     }
     }
    break;
     }
    default:
    {
    break;
    }
   }
   }
  return fieldset_default;
  }
 
  //返回对象类型
  function My_Type()
  {
   return I_AM_FIELDSET;
  }

  //创建Fieldset部分代码
  function Make_Element($deck)
  {
   printf("<fieldset title=/"%s/">/n",$fieldset_title);

   for($i=0;$i<$this->element_number;$i++)
   {
    $temp_element = $this->fieldset_element[$i];
    switch ($temp_element->My_Type())
    {
     case I_AM_TEXT:
     case I_AM_IMAGE:
     case I_AM_TABLE:
     case I_AM_HYPERLINK:
     case I_AM_INPUT:
     case I_AM_SELECT:
     case I_AM_DO:
     {
      $temp_element->Make_Element(&$deck);
      break;
     }
     default:
     {
      break;
     }
    }
   }
   printf("");
  }
 };
 ?>         *返回文章列表*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值