电脑技术学习

WAP与PHP - 进阶篇之二

dn001

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的一些变量默认值
  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对象方法