来源:www.cncfan.com | 2006-1-11 | (有1782人读过)
你注意到类中没有一个方法,对此不要怀疑。为什么?噢,我猜在一个实际 的环境中,你可能会很好的选择把这三个类组合成一个,根据描述信息改变方法 。然而,这是一个使用了类和子类(继承下来的)的现实的例子,并且我选择子 类的原因是我可以给信息栏增加更多的"滋味"(例如,图角),我可以创建更深 层的子类,增加正确代码的可移植性。
linkbox类
这个类将使用它所提供的数据,并且用它来为我们生成链接框。根本上说, 是将一个多维的数组解析成为链接框。这就意味着数组将由数据片段组成,每个 片段有两个部分--一部分为你想让用户看见的,一部分为实际的URL。
<?php
class linkbox extends genericinfo { /* 创建对象。你将会注意到,我们没有为变量保留内存空间。在这个情况下, 不需要。 */
/* 这是linkbox的构造函数。它所做的唯一一件事就是调用父类的构造函数。为什么 ? 就是,在PHP管理了部分的面向对象的功能的同时。但是有一点失败的地方(在此 刻) 就是子类中的构造函数。那么,为了保证子类使用父类的构造函数被实例化,我 简单 地调用了父类的构造函数。当然如果我接着想要覆盖任何值,我能够很容易地改 变它。 */ function linkbox() { $this->genericinfo(); } /* 这是类中仅有的方法。相当简单,如你所见,它绘制表格,放置所要求的数据在
适当的位置。 */ function drawlinkbox() {
echo( "<TABLE BORDER=\"$this->outerborderwidth\" CELLPADDING=\ "0" CELLSPACING=\"0\" WIDTH=\"$this->outerwidth\" BORDERCOLOR=\"$this ->outerbordercolor\" BGCOLOR=\"$this->titlebgcolor\">"); echo( "<TR>"); echo( "<TD>"); if (isset($this->cssboxtitle)) { echo( "<DIV CLASS=\"" . $this->getcssboxtitle() . "\">"); echo($this->title); echo( "</DIV>"); } else { echo($this->title); } echo( "</TD>"); echo( "</TR>"); echo( "<TR>"); echo( "<TD>"); echo( "<TABLE BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"0\" WIDTH=\"$this->innerwidth\" BGCOLOR=\"$this->innerbgcolor\">"); echo( "<TR>"); echo( "<TD>"); echo( " "); for ($x = 0; $x < count($this->data); $x++) { echo( " <A HREF=\"" . $this->data[$x][1] . "\">" . $th is->data[$x][0] . ""); } echo( " "); echo( "</TD>"); echo( "</TR>"); echo( "</TABLE>"); echo( "</TD>"); echo( "</TR>"); echo( "</TABLE>"); } }
?>
resultbox Class
这个与linkbox类没有什么不一样的,除了没有HREF包含在其中。我们创建了 一个两列的表格,并且将分析后的数据放在其中。
<?php class resultbox extends genericinfo { /* 创建对象。你将会注意到,我们没有为变量保留内存空间。在这个情况下, 不需要。 */
//constructor function resultbox() { $this->genericinfo(); } /* 这是类中仅有的方法。相当简单,如你所见,它绘制表格,放置所要求 的数据在 适当的位置。 */ function drawresultbox() {
echo( "<TABLE BORDER=\"$this->outerborderwidth\" CELLPADDING=\ "0" CELLSPACING=\"0\" WIDTH=\"$this->outerwidth\" BORDERCOLOR=\"$this ->outerbordercolor\" BGCOLOR=\"$this->titlebgcolor\">"); echo( "<TR>"); echo( "<TD>"); if (isset($this->cssboxtitle)) { echo( "<DIV CLASS=\"" . $this->getcssboxtitle() . "\">"); echo($this->title); echo( "</DIV>"); } else { echo($this->title); } echo( "</TD>"); echo( "</TR>"); echo( "<TR>"); echo( "<TD>"); echo( "<TABLE BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"0\" WIDTH=\"$this->innerwidth\" BGCOLOR=\"$this->innerbgcolor\">"); for ($x = 0; $x < count($this->data); $x++) { echo( "<TR>"); echo( "<TD>"); echo($this->data[$x][0]); echo( "</TD>"); echo( "<TD>"); echo($this->data[$x][1]); echo( "</TD>"); echo( "</TR>"); } echo( "</TABLE>"); echo( "</TD>"); echo( "</TR>"); echo( "</TABLE>"); } }
?>
Index.phtml
这些东西是如何组合在一起的呢?好,最好的演示就是创建我们将用之表现 给用户的内容的页面,名为index.phtml
1: <? 2: include "constants.inc"; 3: include "mysqldb.obj"; 4: include "genericinfo.obj"; 5: include "linkbox.obj"; 6: include "resultbox.obj" 7: ?> 8: <HTML> 9: <HEAD> 10: <TITLE> 11: <? echo($TITLE); ?> 12: </TITLE> 13: <LINK TYPE="text/css" REL="stylesheet" HREF="main.css">
14: </HEAD> 15: 16: <BODY BGCOLOR="#FFFFFF"> 17: 18: <TABLE BORDER="0" CELLPADDING="10" CELLSPACING="10"> 19: <TR VALIGN="top"> 20: <TD> 21: <? 22: 23: $db0 = new mysqldb(); 24: $db0->setsql("SELECT tem_team, tem_url FROM team ORDER BY tem_id"); 25: if ($db0->selectquery()) { 26: $lnk = new linkbox(); 27: $lnk->settitle("F1 Teams"); 28: $lnk->data = $db0->result; 29: $lnk->drawlinkbox(); 30: } else { 31: echo("[Error:] Unable to connect"); 32: } 33: 34: ?> 35: </TD> 36: <TD> 37: <? 38: 39: $db1 = new mysqldb(); 40: $db1->setsql(" SELECT 41: CONCAT(\"\",UPPER(driver.drv_surname), \ " ", driver.drv_forename), 42: SUM(points.pts_teampoints) as totdriverpoin ts 43: FROM points 44: LEFT JOIN driver ON points.drv_id = driver. drv_id 45: GROUP BY driver.drv_surname, driver.drv_forenam e 46: HAVING totdriverpoints <> 0 47: ORDER BY totdriverpoints DESC"); 48: 49: if ($db1->selectquery()) { 50: $rst = new resultbox(); 51: $rst->setouterwidth(175); 52: $rst->setinnerwidth(171); 53: $rst->settitle("F1 Drivers Championship"); 54: $rst->data = $db1->result; 55: $rst->drawresultbox(); 56: } else { 57: echo("[Error:] Unable to connect"); 58: } 59: 60: ?> 61: </TD> 62: <TD> 63: <? 64: 65: $db2 = new mysqldb(); 66: $db2->setsql(" SELECT 67: team.tem_team, 68: SUM(points.pts_teampoints) as totteampoints
69: FROM points 70: LEFT JOIN team ON points.tem_id = team.tem_ id 71: GROUP BY team.tem_team 72: HAVING totteampoints > 0 73: ORDER BY totteampoints DESC"); 74: 75: if ($db2->selectquery()) { 76: $rst = new resultbox(); 77: $rst->setouterwidth(175); 78: $rst->setinnerwidth(171); 79: $rst->settitle("F1 Constructor's Championship"); 80: $rst->data = $db2->result; 81: $rst->drawresultbox(); 82: } else { 83: echo("[Error:] Unable to connect"); 84: } 85: 86: ?> 87: </TD> 88: </TR> 89: </TABLE> 90: </BODY> 91: </HTML>
解释:
1 - 7行 这些语句将我们在前面所写的文件放在一起,从而使它们的内容有 效。注意,constants.inc文件应该是第一个被包含的文件。如果不这样,它就不 是全局的了。
8 - 20行 这里我们使用了HTML,用来建立页面并且引入样式表。
21 - 34行 返回到PHP,开始使用对象。我们要创建的第一项是F1车队栏。
23 实例化mysqldb类,创建一个mysqldb类的对象;通过$db0来引用。这样就 要执行mysqldb类的构造函数,通过在constants.inc中的全局常量设置mysqldb类 的变量初始值。
24行 调用setsql($req_sel)函数来设置$db0对象的sql属性。
25行 这行很有意思。基本上,如果对mysqldb对象里的selectquery()的调用 失败(或返回false),执行跳到30行。
假设25行返回true,我们就得到了数据!不太坏吧?现在让我们继续绘制信 息栏。
26行 实例化linkbox()类,创建一个linkbox类的对象,用$lnk来引用它。这 样将要执行linkbox类的构造函数,它将依次调用父类(genericinfo)的构造函 数。
27行 设置linkbox的标题,通过调用父类的settitle($req_title)方法。
28行 要确保赋给$lnk的数据是有效的,应该与$db0对象的当前数据相同。
29行 调用linkbox类的drawlinkbox()函数。因为$lnk现在处理所以的数据, 它就能够完全绘制出linkbox来。在drawlinkbox函数中要注意的一点是在第16行 到22行。如果设置了$CSSBOXTITLE全局常量,那么样式表将被引用,否则就不会 。
就这样!你现在已经在屏幕上画出了新的信息栏。
35 - 36行 回到HTML代码来结束单元格并且打开一个新的单元格。
从现在开始,你应该能够看完本页代码的剩余部分,看一下其它的对象是如 何被画出来的。
main.css
最后,是样式表,它将被用在整个工作中!不要再多说费话了 ;-)
1: <STYLE> 2: .bugresolver { 3: 4: } 5: TD { 6: font-family: verdana, arial, courier; 7: font-size: 10; 8: } 9: 10: P { 11: font-family: verdana, arial, courier; 12: font-size: 20; 13: } 14: 15: A { 16: font-family: verdana, arial, courier; 17: font-size: 12; 18: color: #000084; 19: text-decoration: none; 20: font-weight: bold; 21: text-align: right; 22: } 23: 24: A:hover { 25: font-family: verdana, arial, courier; 26: font-size: 12; 27: color: #990000; 28: background-color: #DCDADA; 29: text-decoration: none; 30: font-weight: bold; 31: text-align: right; 32: } 33: 34: UL { 35: margin-left: 25; 36: } 37: .boxtitle { 38: font-family: verdana, arial, courier; 39: font-size: 14; 40: color: #FFFFFF; 41: font-weight: bold; 42: text-align: center; 43: } 44: 45: .lnkBox { 46: font-family: verdana, arial, courier; 47: font-size: 10; 48: color: #000084; 49: margin-left: 5px; 50: text-align: left; 51: } 52: </STYLE>
例子/下载
对于那些想下载这个例子,并且自已试一下的来说,有一个ZIP文件[http:/ /phprecord.e-chome.net/docs/mark20000727.zip]
对于有OO经验的人
我很清楚在代码中有很多的漏洞。例如,我没有完成在设置或返回属性值时 对数据的检查。然而,记住这个练习的目的是给出人们一个摸拟现实的关于在PH P 中的面向对象的处理与函数使用的例子(人们可以学习它)。
对于没有OO经验的人
这是一个模拟现实的关于在PHP中的面向对象的处理与函数使用的例子。在代 码中有很多的漏洞。那并不是说代码是错误的,但是它的功能是向你演示如何用 OO来工作。
如果你正在寻求更多的指导,想要发展这些代码用在你的站点上,你应该重 新看一下很多在这些页面中的get和set函数,确保你开发的处理数据的例程被处 理;确保它拥有正确的数据类型(例如在需要的时它可为整数,在需要时它可为 SQL 语句)。记住,这些类所处理的数据是从已经存在的数据库来的,所以我知 道数据是有效的。
要知道使用这些信息栏的更多的例子,请参观e-sphere.net, f1circle.com 和 markaw.com。
关于作者
此时,Mark Williams,是一个专业的在欧洲排名为前10名的保险公司之一的 高级技术顾问,正从事着大量的因特网/电子商务的工作,包括WAP技术,视频会 议,Windows 2000,Linux等等...
为了放松,Mark是一个F1赛车的爱好者,每个星期日(在赛季中)你总会发现 他在了解最新的消息。
去markaw.com,e-sphere.net 和 f1circle.com可以了解更多的信息。
|