admin 管理员组

文章数量: 1087139


2024年4月29日发(作者:linux系统下载 迅雷下载)

维普资讯

i l—I l一■●■■ 

建立灵巧结构的 —] 

首先要说明一点,笔者写这篇文章并不是要教大家如何做 

才能写出一个结构非常舍理的程序。只是想通过本文提出一个 

论题,与大家一起来讨论关于如何建立一个有效地、灵活的网 

络应用程序。 

当然还有一些其它的东西,但我认为那都不在本文 

的讨论范围之内,或许你可以在实际的工作中发现它们。 

让我们详细地谈谈每一条吧。 

笔者在编写SourceForge过程的一些教训更加让我认识到 

了:“好的代码应被分成了多个部分,合理的库及函数调用, 

清晰的数据库结构,站点的每一个部分与其它部分都是相对独 

立的。 在实践中,不可否认我的编程水平又得到一定的提 

高。但是这并不足以让我觉得骄做。园为,即便如此做了这仍不 

是最好的。如果我可以重写这个程序,我将更多的关注于}胤层 

与数据层的分离,通过对象及清楚的函数库实现这一点。 

这是我认为昂台理的程序结构! 

l,赣据摩无关性 

你从不知道你的站点将会在哪里运行,当然在你创 

建它时,你希望它变得很大并且有很高的辩【量。所以你 

不想把你自己约束在孵Access或者其它轻便的数据库系 

统上。虽然你不能立矗4地插入各种不同的数据库系统.但 

是你有可能很方便地在它们中问切换。街有—些不同的选 

择可以把你的数据库调用抽象出来。在PHP中—个奇特的 

方法是你不得不为每个不同的数据库系统写出不同的代 

码.园为在P肿中对每一种不同的数据库的访问函数是不 

同的。为了避开这点,你可以便用一个抽象地数据库访 

问层,就象PHPLi b、下一个版本的PEAR、及我们在 

很多时候,我更喜欢用优美的图形及图表来描述我的想 

法,这将给人留下最直观的印象。用这种隐藏在一个结构后的 

想法,悔可以把你的逻辑与外观分离,这意睬著任何一个复杂 

的程序都可以用 API/Data Access Layer 来表述。 

与其把安全检测、更新的句子等放在HTML层中,不如把 

它仃埋咐地放在你的API层里。而这个HTWL层只含有简单的函 

数调用和返回的数组、对象或自定的其它什么,以及一些数据 

库的捡素结果的集合等。如果你这样做了,顶层将是非常的瘦 

小,你可以方便地创建及维护它。 

SourceForge中描述的那样。 

2,界一无关性 

个应用程序是它的技术更重要还是它所运行韵站点 

更重要?我们并不能真正地知道。我从来不相信这一点一 

}仃n是一个标准。特别是对于一个网络应用程序而言, 

界面发生了改动,意味着我们不得不总是重写。但是如 

果你的应用程序是根太根复杂的,伯减要为你的数据库建 

立一些其它的接口了,如果你不想在你的站点程序中到处 

都充斥着COpy&paste等代码的话。这也意嗥着,如果 

你正确地设计了你的应用程序,你可以粮容易地致写你的 

站点让它适应WAP,只要简单地写一个小的WAP界面,并 

让它调用你的数据库访问对象而已。但若你没有很好地设 

计你的程序,把h ̄rML版改成WAP版将是一个复杂的工程。 

我把这个想法也带入了SourceForge中,我们有—个 

_ 

灵活的PHP程序结构最基本的方面有以下几点 

数据库无关性 

界面无关性 

可移植性 

面向对象或至少应由函数库组成 

巨大的用户群,为我们发送/接收bugs、任务等。首先, 

我们指出所有的这些将通过我们的web页面接口,然后, 

证有其它的? 

由于Eric Raymond和其他^给的压力,费们决定甩x札 

维普资讯

来做数据库的外部接口。这个SourceForge的bugs E艮踪器和 

其它的一些工具被分成两个库:HTML库和数据访问库。这个 

数据访问库检查输入的值的正确性,处理安全校验,并且当 

成功/失败时返回TRUE或FALSE。 

/向 let's updatethe h 

I工esu】t=db_que ( 【吨A丁E hIg 

s盯fiel ̄--'Sfie|d ̄. 

eld3= ¥fielfl3' 

mE i4-'¥fiel41一): 

由于简化的原因,这个例子并没有基于一个完善的对象 

模式,那样我还要解释这个基类和它的一些衍生类等等,我 

想这个倒子将给体一个最普通的想法。 

町札库的例子 

<?p 

//n check ym query for success/failm 

if(!暑result){ 

//update failed 

ret false 

}el3e( 

r吐urn true: 

// ̄ lbect to database 

require( datahas ̄曲口 ). 

//c 嘲util s 1iBU header/footer 

require( htⅡ1_曲D ). 

//<hta s library 

require( b dat ). 

echo site header( Page Title ). 

echo <[{4>Updating A ̄ag</H4> 

<P> 

3 可移蕾性 

毫无疑问,你不想让你的代码只能用于一个固定的站 

矗 

元素的名称、字体或其它 

面所 

if(b da date(Ifle1d1,Sfield2.Sfield3)){ 

些什么,这样应设置一个config文件,它被多倾

echo qI3>Upda ̄e Failed 0(/t13> 

包含。更好的观点是你的站点被模块化,你不需要 

else{ 

echo 锄M曲t酣Bug SuccessfuI】y<订口> 

copy&paste任何一个I眦文件,我倾向于拶吝些放八—个函 

数,在任何需要的地方调用它们 

//echo the global err盯string 

echo¥feeflback 

同样的方法可用于数据库的密码、数据库连接字串等, 

这些可以放入一个数据库处理的抽象层中。 

cheo sitef ̄ter(). 

> 

4 面向对象,函数化 

我们不是用COBOL开发,所以这意味着我们可以把进程 

分成多个函数的调用。每个调用都是一个自动的行为.有时 

仅仅是调用一小段其它的函数并返回这个结果。 

Data访问库的例子 

( 

 -

p 

抖 

+ 

个好的例子是在每—个页面校验用户是否登录.你可 

{controls access to updating a b in the 

以用cookie或查询数据库来完成这个功能,但一旦你想改变 

你的验证系统,你不得不改动每一个页面,其实像应该可以 

通过改动函数库里一个普通的函数就完成这个变动的。任何 

时候,体写一段代码,如果它将会被用于多于一个地方,你 

就要考虑把它放入一个库里了。 

database.Validates data and checks se ̄ity 

Returns true㈣

■ 

es&false oll faill】 e 

f 

f∞cti哪Bug data update(¥field].Sfie1d2.¥field3) 

//gld ̄l striT to report back目T。fs 

gld ̄al Sfeedback. 

,,lfie1吐1 and¥fielc ̄are required 

if([¥fieldl I }fie1d2){ 

l b日dF e d lⅫField 2 Are P ̄uired 

显然还有报多我没有谈到的事,告诉我你的想法,我们 

可以在以后继续讨论。特别地是,如果你写了一个大型的 复 

杂的应用程序,我想听听你是如何规划它的及髓撤时有什么 

to update 

ret L玳l fB】se 

//make s口e this lls has口 ms 

不同的想法。■ 

if(1urer[s n0)【 

lfeedb日c】F 叫k ̄ust Be^n A in To Update a珏』 

retum fBlse; 


本文标签: 数据库 调用 站点 结构 函数