建立灵巧结构的PHP程序_php基础

很早就想写这篇文章了,但一直没有时间完成它。不是说我来告诉大家如何做,我更希望本文只是做为一个引子,与大家来讨论关于如何建立一个有效地、灵活的网络应用程序。

经过了2-3年的网络应用程序开发工作,我的开发经验变得更加生动了,回过头来看我以前为Geocrawler写的代码,简直不敢相信这是我的。由于GPL的原因,在PHPBuilder中的源码也是良莠不齐的。

最近我做为一个有经验的PHP开发者,一直在帮着写SourceForge,我想这显示出了最终结果的一个范围。好的代码应被分成了多个部分,合适的库及函数调用,清楚的数据库结构,站点的每一个部分与其它部分都是相对独立的。

但是,这仍不是最好的。如果我可以重做,我将更多的关注于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 访问库的例子

3、可移植性

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

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

4、面向对象/函数化

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

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

其它还有什么?

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

时间: 2024-12-28 20:45:44

建立灵巧结构的PHP程序_php基础的相关文章

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

程序 建立灵巧结构的PHP程序 时间:2000/10/19 09:06 作者:sharetop 奥索网 很早就想写这篇文章了,但一直没有时间完成它.不是说我来告诉大家如何做,我更希望本文只是做为一个引子,与大家来讨论关于如何建立一个有效地.灵活的网络应用程序. 经过了2-3年的网络应用程序开发工作,我的开发经验变得更加生动了,回过头来看我以前为Geocrawler写的代码,简直不敢相信这是我的.由于GPL的原因,在PHPBuilder中的源码也是良莠不齐的. 最近我做为一个有经验的PHP开发者,

建立灵巧结构的PHP程序

很早就想写这篇文章了,但一直没有时间完成它.不是说我来告诉大家如何做,我更希望本文只是做为一个引子,与大家来讨论关于如何建立一个有效地.灵活的网络应用程序. 经过了2-3年的网络应用程序开发工作,我的开发经验变得更加生动了,回过头来看我以前为Geocrawler写的代码,简直不敢相信这是我的.由于GPL的原因,在PHPBuilder中的源码也是良莠不齐的. 最近我做为一个有经验的PHP开发者,一直在帮着写SourceForge,我想这显示出了最终结果的一个范围.好的代码应被分成了多个部分,合适的

15个小时----从修改程序到自己些程序_php基础

本文属于被风吹倒的男子原创,拥有版权.来自www.iphp.org的论坛,网络转载请保留本信息.非网络转载请联系本人.个人站长自己写东西不容易,也为能够给我继续写下去的勇气和动力,请在转载时候不要删除本说明.本文是第一篇,我会找时间陆续把以后的东西写出来的. 很多朋友对于php的认识,长期停留在修改别人的程序上,因为可以修改所以懒惰于进步.或者是买来书看的时候,发现php的函数超级无敌多,看到函数库被吓晕了.等等.我自己是属于后者.本文是专门对于针对懒的花时间学习php,但是又想自己做点东西的懒

建立动态的WML站点(一)_php基础

支持WAP功能的移动电话越来越多了.因此,你也应该考虑一下建立自己的WML网站了,本文要介绍的是如何建立PHP/WML页面的站点,使用MySQL数据库,可动态更新站点的内容,具体例子是某个学院的教授授课时间和测验时间表.一点也不复杂哦 :-)   在开始之前,你应该准备好以下东东: 1.你已经正确安装好PHP和MySQL,并且有使用两者编程的经验. 2.你有SQL的相关知识 3.你运行的是Apache并且可写.haccess文件:或者你运行IIS并且你可以增加映射(或者你可以让系统管理员帮你的忙

PHP的开合式多级菜单程序_php基础

# -------------------------------------------------------- # 数据表的结构 'menu' # --------------------------------------------------------CREATE TABLE menu ( menu_id int(11) NOT NULL auto_increment, menu varchar(20) NOT NULL, menu_grade int(11) NOT NULL,

超级简单的发送邮件程序_php基础

最近做一个新闻系统,为了模仿各大网站的在线发信功能就写了这个小程序,希望对各位菜鸟兄弟有用.     我没有给出一部分代码,只给出关键部分.其中shouxin代表收信人地址,shouren代表收信人姓名,jixin代表发信人地址,faren代表发信人姓名.id是前边传过来的参数,对你来说根本没什么用的. <? if($shouxin=="") { echo "没有收件人的地址,无法寄出"; }else{ $to=explode(',',$shouxin); $

建立动态的WML站点(三)_php基础

接着用户必须在下一个文件(index3.wml)中输入.我们要求用户输入科目的名字或者教授的姓.你要留意一下变量在页面之间是怎样传送的.语法看来有点复杂,不过可以让你了解整个过程是怎样通过几个文件来完成的. <?php  Header("Content-type: text/vnd.wap.wml");  header("Cache-Control: no-cache, must-revalidate");  header("Pragma: no-c

一个显示天气预报的程序_php基础

刚开始学PHP,先编写了一个程序,放在自己的主页上,可以显示天气预报,当然还很不完善,希望大家给提意见.程序如下:<?$fcont=file("http://www.bjmb.gov.cn/today.asp");$arr=array();for($i=0;$i<count($fcont);$i++){    $tmp=$fcont[$i];    $tmp=ereg_replace("<br>"," ",$tmp);  

用Zend Encode编写开发PHP程序_php基础

Zend Encode的工作原理 使用PHP的人都知道,它是一个脚本编程工具,用它写的程序,必须以源码的形式放置在Web服务器上,所以我们无法保护自己的源代码.大家都知道任何一个脚本程序的执行效率同具有相同功能的编译好的二进制代码相比较,它的执行效率都是比较低的.那么要是有一个工具能够帮我们把用PHP写的程序编 译成二进制代码就好了,这样不但执行效率提高了, 运行速度也加快了.真要是有这么一个工具,那就是 一举两得了. 现在这不是梦想了,Zend Encode就是为此而开发的,它可以直接将脚本编