电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> PHP>>php4的对象编程(续):

php4的对象编程(续)

来源:www.cncfan.com | 2006-1-11 | (有1510人读过)


  你注意到类中没有一个方法,对此不要怀疑。为什么?噢,我猜在一个实际
的环境中,你可能会很好的选择把这三个类组合成一个,根据描述信息改变方法
。然而,这是一个使用了类和子类(继承下来的)的现实的例子,并且我选择子
类的原因是我可以给信息栏增加更多的"滋味"(例如,图角),我可以创建更深
层的子类,增加正确代码的可移植性。

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可以了解更多的信息。
PHP热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2022 电脑爱好者 版权所有 备案号:鲁ICP备09059398号