文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>[转帖]建立灵巧结构的PHP程序

[转帖]建立灵巧结构的PHP程序

时间:2007-02-17  来源:PHP爱好者

好的代码应被分成了多个部分,合适的库及函数调用,清楚的数据库结构,站点的每一个部分与其它部分都是相对独立的。 

  但是,这仍不是最好的。如果我可以重做,我将更多的关注于HTML层与数据层的分离,通过对象及清楚的函数库实现这一点。 

优美的图形 

  我知道经理们喜欢用优美的图形及图表来描述它们,这将给我们留下最好的印象。用这种隐藏在一个结构后的想法,你可以把你的逻辑与外观分离,这意味着任何一个复杂的程序都可以用"API/Data Access Layer"来表述。 

  与其你把安全检测、更新的句子等放在HTML层中,不如把它们整体地放在你的API层里。而这个HTML层只含有简单的函数调用和返回的数组、对象或自定的其它什么,以及一些数据库的检索结果的集合等。 

  如果你这样做了,顶层将是非常的瘦小,你可以方便地创建及维护它。 

  如下的例子中,这个HTML接口中只有一些API层中的函数的直接调用,一些HTML工具库(它能生成一个弹出框等等),和一些从数据库抽象层中调用的数据库操作方法(你不需要绑定某一个特别的数据库)。 

基础 

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

数据库无关性 
界面无关性 
可移植性 
面向对象或至少应由函数库组成 

还有其它的? 
当然还有一些其它的东西,但我认为那都是太大了,或许你自己能指出它们。 

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

1、数据库无关性 

  你从不知道你的站点将会在哪里运行,当然在你创建它时,你希望它变和得很大并且有很高的流量。所以你不想把你自己约束在 MS Access 上面或者其它什么轻便的数据库系统。虽然你不能立刻地插入各种不同的数据库系统,但是你有可能很方便地在它们中间切换。你有一些不同的选择可以把你的数据库调用抽象出来。在PHP中一个奇特的方法是你不得不为每个不同的数据库系统写出不同的代码,因为在PHP中对每一种不同的数据库的访问函数是不同的。为了避开这点,你可以使用一个抽象地数据库访问层,就象PHPLib、下一个版本的PEAR、及我们在SourceForge中描述的那样。 

2、界面无关性 

  一个应用程序是它的技术更重要还是它所运行的站点更重要?我们并不能真正地知道。我从来不相信这一点--HTML是一个标准。特别是对于一个网络应用程序而言,界面发生了改动,意味着我们不得不总是重写。但是如果你的应用程序是很大很复杂的,你就要为你的数据库建立一些其它的接口了,只要你不想在你的站点程序中到处copy&paste你的访问检查等代码。这也意味着,如果你正确地设计了你的应用程序,你可以很容易地改写你的站点让它适应WAP,只要简单地写一个小的WAP界面,并让它调用你的数据库访问对象而已。但若你没有很好地设计你的程序,你把你的HTML版改成WAP版是一个复杂的工程。 

  我把这个想法也带入了SourceForge中,我们有一个巨大的用户群,为我们发送/接收bugs、任务等。首先,我们指出所有的这些将通过我们的web页面接口,然后,由于Eric Raymond 和其他人给的压力,我们决定用XML来做数据库的外部接口。 

  幸运的是我们曾在四月已把程序的核心逻辑代码与它的界面分离了。我将试着表达我们是如何做的,希望对你的工作有所帮助。 

  这个SourceForge的bugs跟踪器和其它的一些工具被分成两个库 - 这个HTML库和数据访问库。这个数据访问库检查输入的值的正确性,处理安全校验,并且当成功/失败时返回TRUE 或 FALSE。 

  由于简化的原因,这个例子并没有基于一个完善的对象模式,那样我还要解释这个基类和它的一些衍生类等等,我想这个例子将给你一个最普通的想法。 

HTML 库的例子 

//connect to database 
require ("database.php"); 

//common utils like header/footer HTML 
require ("html.php"); 

//data access library 
require ("bug_data.php"); 

echo site_header("Page Title"); 

echo "

Updating A Bug

"; 

if (bug_data_update($field1,$field2,$field3)) { 

echo "

Update Failed!
"; 

} else { 

echo "
Updated Bug Successfully
"; 
//echo the global error string 
echo $feedback; 


echo site_footer(); 

?> 

Data 访问库的例子 

/** 

* controls access to updating a bug in the 
* database. Validates data and checks security 
* Returns true on success, false on failure 

*/ 

function bug_data_update ($field1,$field2,$field3) { 
//global string to report back errors 
global $feedback; 

//$field1 and $field2 are required 
if (!$field1 || !$field2) { 
$feedback="Field 1 And Field 2 Are Required"; 
return false; 


//make sure this user has permission to update 
if (!user_isadmin()) { 
$feedback="You Must Be An Admin To Update a Bug"; 
return false; 


//now let's update the bug 

$result=db_query("UPDATE bug ". 
"SET field2='$field2',". 
"field3='$field3' ". 
"WHERE id='$field1'"); 

//now check your query for success/failure 
if (!$result) { 
//update failed 
return false; 
} else { 
return true; 



?> 

3、可移植性 

  毫无疑问,你不想让你的代码只能用于一个固定的站点,将来我们可能改变色彩的选择、元素的名称、字体或其它一些什么,这样应设置一个config文件,它被多个页面所包含。更好的观点是你的站点被模块化,你不需要copy&paste任何一个HTML文件,我倾向于把这些放入一个函数,在任何需要的地方调用它们。 

  同样的方法可用于数据库的密码、数据库连接字串等,这些可以放入一个数据库处理的抽象层中。 

4、面向对象/函数化 

  我们不是用COBOL开发,所以这意味着我们可以把进程分成多个函数的调用。每个调用都是一个自动的行为,有时仅仅是调用一小段其它的函数并返回这个结果。 

  一个好的例子是在每一个页面校验用户是否登录,你可以用cookie或查询数据库来完成这个功能,但一旦你想改变你的验证系统,你不得不改动每一个页面,其实你应该可以通过改动函数库里一个普通的函数就完成这个变动的。任何时候,你写一段代码,如果它将会被用于多于一个地方,你就要考虑把它放入一个库里了。 

其它还有什么? 

  显然还有很多我没有谈到的事,告诉我你的想法,我将在下一篇文章中来讨论它们。特别地是,如果你写了一个大型的、复杂的应用程序,我想听听你是如何规划它的及你重做时不什么不同的想法。

 chinaworker 回复于:2003-08-29 14:21:02 xie -_-

l0ner 回复于:2003-08-30 04:42:57 我试了一下
还真的不错。

redfox 回复于:2003-09-01 00:40:52 一直认为"数据库无关性","界面无关性"等等"无关性"是比较极端的论调,实际应用中并不如想象的方便,但其造成的代码冗余和性能折扣却是绝对的。

kevinlei 回复于:2003-09-01 05:49:12 哈哈,这点我不同意.我认为这些"无关性"是很正确的论调,特别是"数据库无关性"和"界面无关性".

性能折扣会有一点,但基本上是微不足道的.绝对不会上升到很严重的折扣程度,除非你的程序设计有重大BUG.举个例子,大家看看以前很流行的WDB论坛程序与现在的CTB论坛程序,前者是完完全全的OPP,没有任何"无关性",后者应该是界面无关性的.WDB论坛的作者说"为了速度,我极端地没有使用任何OOP的东西,感觉很累",可是其速度并不比OOP的CTB好多少.不过我批评一句,这两个论坛的开发者干吗不用数据库呢???我实在找不出文本论坛的优势.WDB作者后来开发的PHP+MYSQL的FASTBOARD就很不错啊.

至于代码冗余,我认为只要性能影响不大,冗余的代码就让它放在那里好了.就象你不会拒绝你的电脑旁总是放着个手表,只要手表不打扰你.

redfox 回复于:2003-09-01 11:01:16 不喜欢,程序应该追求最高效率,没有必要的代码就没有必要存在。要达到最佳的效率就必须具体情况具体分析,什么应用就用什么代码。不明白有些人搞个什么小小的留言本,为何也要去套什么xx模版、xx数据接口,好像不套点别人的东东就不上品了。鄙视ing...   

效率的提高必将导致效益的提高![/color:3afe76fb21]

我认为所谓好的程序员不是打字快、掌握了一些函数、能实现功能就行了的,这些远远不够。对系统的分析优化,从对操作系统到数据库等各方面的了解,而致力达到最佳的程序效率,才能称得上好。

而据我的经验,大量“无关性”的结合必将导致程序效率的大幅下降。绝不是危言耸听。正所谓:有得必有失。[/color:3afe76fb21]

kevinlei 回复于:2003-09-01 18:17:57 小程序套XX摸板YY数据接口实在是杀鸡用牛刀,非常没有必要.帮你一起鄙视ING....不过这种人却很好地贯彻了你的思想:"我总是尝试着用最简单的方法解决最复杂的问题" 玩笑 

虽然这样开发,确实很EASY,而且本来就是小程序嘛,套这些东东并不觉得会拖慢多少速度.不过,要是一辈子都这样开发程序,那就完了....所以说,这些东东确实好用,可是不能滥用.比如,一个论坛程序,实现界面无关性就好了,最多再实现数据库无关性,这样就足够了,你要再搞个"浏览器无关性""用户语言无关性",那我实在没话说.

不过,要是那个小程序的开发者不是套用别人的现成的模板和现成的接口,而是根据自己的需要灵活地改造别人的东东,或者自己开发一套适合自己的小程序的接口和模板,那么我是很赞成他这么做的.

呵呵,我们以上的讨论似乎有针对我们坛子里的那位发布SMARTY模板留言本的朋友之嫌,不过我们知道,那位朋友只是试用这个模板,所以并不能包含在我们上面说的那些情况里.

redfox 回复于:2003-09-01 18:49:31 对事不对人哦,easy不easy也是看情况了
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载