试验以下下面的PHP代码(假设你已经包含了Style类,并为其创建了一个实例$Basic,然后页面中已经有了 和 <HEAD></HEAD> 标签)
<?php $Basic->Body(); ?>
这样我们就可以输出一些东西到页面中了,我们可以采用传统的方法,但我想做点不同的….(这个作者故弄玄虚,幽默过头了—译者注)这就是我用的另外一个成员函数TextOut:
<?php
function TextOut($message= " ") {
PRINT " "text">$message ";
}
?>
这个函数需要一个参数$message,$message是你要输出的文字,该函数会以指定的属性输出这些文字。我们可以通过如下方法实现:
<?php
$Basic->TextOut( ''This is my test message'');
$Tbody->TextOut( '' -- kinda neat, huh?'');
?>
注意,由于这两个函数中间没有输出回车换行<br>,所以结果将输出到同一行上。而我还想要第二部分的字体更小一点,这个我在上面的$Tbody对象中已经声明了,这样比较安全,$Tbody与$Basic唯一的不同还有个$bgcol属性,在这里没有用到。注意到了程序声明中的” ”吗?这是用来在没有参数传递给函数时函数,函数就输出缺省的不间断空格,原因后述。
到目前为止,我们的工作还没有保存。最后的一个例子说明如何通过一种简单的方法,来修改字体的颜色和或大小,即使在一个输出语法的中间,也不需要改动整个类。我们加入如下的代码:
<?php
function TDOut ($message= " ",$colspan=1) {
PRINT "<TD COLSPAN=$colspan BGCOLOR="$this->bgcol" ".
"ALIGN="$this->align" VALIGN="$this->valign">";
$this->TextOut($message);
PRINT "</TD>
";
}
?>
那么,讲解就到此为止!记住我想让我的表格有不同的背景颜色,我可以这样实现:
<TABLE>
<TR>
<?php
$Theader->TDOut( "Name",2);
$Theader->TDOut( "Location",3);
?>
</TR>
<TR>
<?php
$Theader->TDOut( "Last");
$Theader->TDOut( "First");
$Theader->TDOut( "City");
$Theader->TDOut( "State/Province");
$Theader->TDOut( "Country");
?>
</TR>
这里,你可以看到colspan参数是如何起作用的,如果没有声明,将会有个缺省值1。于是在第一个行“Name”中,合并了2列;Location行合并了3列。第二行,所有的列都被合并成了一个。
我们通过如下方式来实现表体:
<TR>
<?php
$Tbody->TDOut( "Kreisler");
$Tbody->TDOut( "Rod");
$Tbody->TDOut( "Cortlandt");
$Tbody->TDOut( "New York");
$Tbody->TDOut( "USA");
?>
</TR>
但看起来似乎仍然有些繁琐,我们是否可以节省更多的步骤?那么采用下面的函数:
<?php
function TROut($message) { /*And NO comments about fish, please! ;) */
PRINT "<TR>
";
$cells=explode( "|",$message);
$iterations=count($cells);
$i=0;
while ($i<$iterations) {
list($message,$span)=explode( ":",$cells[$i]);
if (strlen($message)<1) $message= " ";
if ($span){
$this->TDOut ($message,$span);
}else{
$this->TDOut ($message);
}
$i++;
}
PRINT "</TR>
";
}
?>
WOW!看起来有些繁琐,我们来分解一下:
第3行根据”|”符号分解一个字符串,并且将分解出来的每个元素都放到数组$cell中。第四行取得数组的中数组元素的个数到$iterations;第6行开始一个循环处理数组中的每个元素。第7行以”:”作为分隔符分解一个数组元素,将其存储到$message和$span中。第8行检查$message是否有值。如果没有就赋一个缺省值。第九行检查有没有$span(就是合并不合并单元格,通过$cell数据中冒号后还有$span来要确定),如果是这样,第10行调用TDOut函数,传递$message和单元格个数参数;如果没有第12行程序单纯输出$message信息(TDOut函数就用缺省值1来设置$colspan属性)。最后,我们结束一个表格行(通过</tr>)。
或许你看了还有些糊涂(不糊涂才怪),到底如何传递给TROut参数才能包括所有的必要信息?正确地格式就是:celldata[:colspan]|celldata[:colspan]|......celldata[:colspan](用|分隔单元格,单元格中数据后跟:号分隔的合并单元格的数目来指定要扩展本单元格的个数—译者注。)
所以,总结一下我们以前所作的工作,表头和表体可以通过下面的调用来完成:
<TABLE>
<?
$Theader->TROut( "Name:2|Address:3");
$Theader->TROut( "First|Last|City|State/Province|Country");
$Tbody->TROut( "Rod|Kreisler|Cortlandt|New York|USA");
?>
</TABLE>
Wow!是不是非常的简单?(实际上的确非常简单,但是这个作者写的还不足以让人认识到这一点。也就是说给的例子缺乏说服力,我个人就觉得依靠TROut这行代码,输出一个行还不如样式表来得简单。作者起码用一个BBS的例子来说明OOP在PHP中的用处才有意义。当然了,作为PHP中OOP的入门课程,本文也算生动了,而且各个方面讲得也差不多。)。
如果有单元格中的数据存放在变量中的情况怎么办?只要Join数组就可以了:
<?php
$message=join($arry, "|");
$Tbody->TROut($message);
?>
当然,你不能在一个Join中同时输入列扩展的单元格数,但是你可以再用一个。假设你的数组包含6个元素,第3和第4行分别要扩展2个和3个单元格,你可以通过如下代码实现将:#扩展格数参数指定到$message中
$newarray=$arry;
$newarray[2]=join(list($newarray[2],"2"),":");
$newarray[4]=join(list($newarray[4],"3"),":");
$message=join($newarray,"|");
$Tbody->TROut($message);
显然,你可以加入更多的成员函数。如果有人有更好的想法,可以Email给我,我会封装更多的代码并发表出来。