建立灵巧结构的PHP程序
2023-06-13 09:13:42 时间
很早就想写这篇文章了,但一直没有时间完成它。不是说我来告诉大家如何做,我更希望本文只是做为一个引子,与大家来讨论关于如何建立一个有效地、灵活的网络应用程序。
经过了2-3年的网络应用程序开发工作,我的开发经验变得更加生动了,回过头来看我以前为Geocrawler写的代码,简直不敢相信这是我的。由于GPL的原因,在PHPBuilder中的源码也是良莠不齐的。
最近我做为一个有经验的PHP开发者,一直在帮着写SourceForge,我想这显示出了最终结果的一个范围。好的代码应被分成了多个部分,合适的库及函数调用,清楚的数据库结构,站点的每一个部分与其它部分都是相对独立的。
但是,这仍不是最好的。如果我可以重做,我将更多的关注于HTML层与数据层的分离,通过对象及清楚的函数库实现这一点。
优美的图形
我知道经理们喜欢用优美的图形及图表来描述它们,这将给我们留下最好的印象。用这种隐藏在一个结构后的想法,你可以把你的逻辑与外观分离,这意味着任何一个复杂的程序都可以用"API/DataAccessLayer"来表述。
与其你把安全检测、更新的句子等放在HTML层中,不如把它们整体地放在你的API层里。而这个HTML层只含有简单的函数调用和返回的数组、对象或自定的其它什么,以及一些数据库的检索结果的集合等。
如果你这样做了,顶层将是非常的瘦小,你可以方便地创建及维护它。
如下的例子中,这个HTML接口中只有一些API层中的函数的直接调用,一些HTML工具库(它能生成一个弹出框等等),和一些从数据库抽象层中调用的数据库操作方法(你不需要绑定某一个特别的数据库)。 基础
灵活的PHP程序结构最基本的方面有以下几点:
数据库无关性
界面无关性
可移植性
面向对象或至少应由函数库组成
还有其它的?
当然还有一些其它的东西,但我认为那都是太大了,或许你自己能指出它们。
让我们详细地谈谈它们每一条吧。
1、数据库无关性
你从不知道你的站点将会在哪里运行,当然在你创建它时,你希望它变和得很大并且有很高的流量。所以你不想把你自己约束在MSAccess上面或者其它什么轻便的数据库系统。虽然你不能立刻地插入各种不同的数据库系统,但是你有可能很方便地在它们中间切换。你有一些不同的选择可以把你的数据库调用抽象出来。在PHP中一个奇特的方法是你不得不为每个不同的数据库系统写出不同的代码,因为在PHP中对每一种不同的数据库的访问函数是不同的。为了避开这点,你可以使用一个抽象地数据库访问层,就象PHPLib、下一个版本的PEAR、及我们在SourceForge中描述的那样。
2、界面无关性
一个应用程序是它的技术更重要还是它所运行的站点更重要?我们并不能真正地知道。我从来不相信这一点--HTML是一个标准。特别是对于一个网络应用程序而言,界面发生了改动,意味着我们不得不总是重写。但是如果你的应用程序是很大很复杂的,你就要为你的数据库建立一些其它的接口了,只要你不想在你的站点程序中到处copy&paste你的访问检查等代码。这也意味着,如果你正确地设计了你的应用程序,你可以很容易地改写你的站点让它适应WAP,只要简单地写一个小的WAP界面,并让它调用你的数据库访问对象而已。但若你没有很好地设计你的程序,你把你的HTML版改成WAP版是一个复杂的工程。
我把这个想法也带入了SourceForge中,我们有一个巨大的用户群,为我们发送/接收bugs、任务等。首先,我们指出所有的这些将通过我们的web页面接口,然后,由于EricRaymond和其他人给的压力,我们决定用XML来做数据库的外部接口。
幸运的是我们曾在四月已把程序的核心逻辑代码与它的界面分离了。我将试着表达我们是如何做的,希望对你的工作有所帮助。
这个SourceForge的bugs跟踪器和其它的一些工具被分成两个库-这个HTML库和数据访问库。这个数据访问库检查输入的值的正确性,处理安全校验,并且当成功/失败时返回TRUE或FALSE。
由于简化的原因,这个例子并没有基于一个完善的对象模式,那样我还要解释这个基类和它的一些衍生类等等,我想这个例子将给你一个最普通的想法。 HTML库的例子
//connecttodatabase
require("database.php");
//commonutilslikeheader/footerHTML
require("html.php");
//dataaccesslibrary
require("bug_data.php");
echosite_header("PageTitle");
echo" UpdatingABug
";
if(bug_data_update($field1,$field2,$field3)){
echo" UpdateFailed! ";
}else{
echo" UpdatedBugSuccessfully ";
//echotheglobalerrorstring
echo$feedback;
}
echosite_footer();
?>
Data访问库的例子
3、可移植性
毫无疑问,你不想让你的代码只能用于一个固定的站点,将来我们可能改变色彩的选择、元素的名称、字体或其它一些什么,这样应设置一个config文件,它被多个页面所包含。更好的观点是你的站点被模块化,你不需要copy&paste任何一个HTML文件,我倾向于把这些放入一个函数,在任何需要的地方调用它们。
同样的方法可用于数据库的密码、数据库连接字串等,这些可以放入一个数据库处理的抽象层中。
4、面向对象/函数化
我们不是用COBOL开发,所以这意味着我们可以把进程分成多个函数的调用。每个调用都是一个自动的行为,有时仅仅是调用一小段其它的函数并返回这个结果。
一个好的例子是在每一个页面校验用户是否登录,你可以用cookie或查询数据库来完成这个功能,但一旦你想改变你的验证系统,你不得不改动每一个页面,其实你应该可以通过改动函数库里一个普通的函数就完成这个变动的。任何时候,你写一段代码,如果它将会被用于多于一个地方,你就要考虑把它放入一个库里了。
其它还有什么?
显然还有很多我没有谈到的事,告诉我你的想法,我将在下一篇文章中来讨论它们。特别地是,如果你写了一个大型的、复杂的应用程序,我想听听你是如何规划它的及你重做时不什么不同的想法。
经过了2-3年的网络应用程序开发工作,我的开发经验变得更加生动了,回过头来看我以前为Geocrawler写的代码,简直不敢相信这是我的。由于GPL的原因,在PHPBuilder中的源码也是良莠不齐的。
最近我做为一个有经验的PHP开发者,一直在帮着写SourceForge,我想这显示出了最终结果的一个范围。好的代码应被分成了多个部分,合适的库及函数调用,清楚的数据库结构,站点的每一个部分与其它部分都是相对独立的。
但是,这仍不是最好的。如果我可以重做,我将更多的关注于HTML层与数据层的分离,通过对象及清楚的函数库实现这一点。
优美的图形
我知道经理们喜欢用优美的图形及图表来描述它们,这将给我们留下最好的印象。用这种隐藏在一个结构后的想法,你可以把你的逻辑与外观分离,这意味着任何一个复杂的程序都可以用"API/DataAccessLayer"来表述。
与其你把安全检测、更新的句子等放在HTML层中,不如把它们整体地放在你的API层里。而这个HTML层只含有简单的函数调用和返回的数组、对象或自定的其它什么,以及一些数据库的检索结果的集合等。
如果你这样做了,顶层将是非常的瘦小,你可以方便地创建及维护它。
如下的例子中,这个HTML接口中只有一些API层中的函数的直接调用,一些HTML工具库(它能生成一个弹出框等等),和一些从数据库抽象层中调用的数据库操作方法(你不需要绑定某一个特别的数据库)。 基础
灵活的PHP程序结构最基本的方面有以下几点:
数据库无关性
界面无关性
可移植性
面向对象或至少应由函数库组成
还有其它的?
当然还有一些其它的东西,但我认为那都是太大了,或许你自己能指出它们。
让我们详细地谈谈它们每一条吧。
1、数据库无关性
你从不知道你的站点将会在哪里运行,当然在你创建它时,你希望它变和得很大并且有很高的流量。所以你不想把你自己约束在MSAccess上面或者其它什么轻便的数据库系统。虽然你不能立刻地插入各种不同的数据库系统,但是你有可能很方便地在它们中间切换。你有一些不同的选择可以把你的数据库调用抽象出来。在PHP中一个奇特的方法是你不得不为每个不同的数据库系统写出不同的代码,因为在PHP中对每一种不同的数据库的访问函数是不同的。为了避开这点,你可以使用一个抽象地数据库访问层,就象PHPLib、下一个版本的PEAR、及我们在SourceForge中描述的那样。
2、界面无关性
一个应用程序是它的技术更重要还是它所运行的站点更重要?我们并不能真正地知道。我从来不相信这一点--HTML是一个标准。特别是对于一个网络应用程序而言,界面发生了改动,意味着我们不得不总是重写。但是如果你的应用程序是很大很复杂的,你就要为你的数据库建立一些其它的接口了,只要你不想在你的站点程序中到处copy&paste你的访问检查等代码。这也意味着,如果你正确地设计了你的应用程序,你可以很容易地改写你的站点让它适应WAP,只要简单地写一个小的WAP界面,并让它调用你的数据库访问对象而已。但若你没有很好地设计你的程序,你把你的HTML版改成WAP版是一个复杂的工程。
我把这个想法也带入了SourceForge中,我们有一个巨大的用户群,为我们发送/接收bugs、任务等。首先,我们指出所有的这些将通过我们的web页面接口,然后,由于EricRaymond和其他人给的压力,我们决定用XML来做数据库的外部接口。
幸运的是我们曾在四月已把程序的核心逻辑代码与它的界面分离了。我将试着表达我们是如何做的,希望对你的工作有所帮助。
这个SourceForge的bugs跟踪器和其它的一些工具被分成两个库-这个HTML库和数据访问库。这个数据访问库检查输入的值的正确性,处理安全校验,并且当成功/失败时返回TRUE或FALSE。
由于简化的原因,这个例子并没有基于一个完善的对象模式,那样我还要解释这个基类和它的一些衍生类等等,我想这个例子将给你一个最普通的想法。 HTML库的例子
//connecttodatabase
require("database.php");
//commonutilslikeheader/footerHTML
require("html.php");
//dataaccesslibrary
require("bug_data.php");
echosite_header("PageTitle");
echo" UpdatingABug
";
if(bug_data_update($field1,$field2,$field3)){
echo" UpdateFailed! ";
}else{
echo" UpdatedBugSuccessfully ";
//echotheglobalerrorstring
echo$feedback;
}
echosite_footer();
?>
Data访问库的例子
3、可移植性
毫无疑问,你不想让你的代码只能用于一个固定的站点,将来我们可能改变色彩的选择、元素的名称、字体或其它一些什么,这样应设置一个config文件,它被多个页面所包含。更好的观点是你的站点被模块化,你不需要copy&paste任何一个HTML文件,我倾向于把这些放入一个函数,在任何需要的地方调用它们。
同样的方法可用于数据库的密码、数据库连接字串等,这些可以放入一个数据库处理的抽象层中。
4、面向对象/函数化
我们不是用COBOL开发,所以这意味着我们可以把进程分成多个函数的调用。每个调用都是一个自动的行为,有时仅仅是调用一小段其它的函数并返回这个结果。
一个好的例子是在每一个页面校验用户是否登录,你可以用cookie或查询数据库来完成这个功能,但一旦你想改变你的验证系统,你不得不改动每一个页面,其实你应该可以通过改动函数库里一个普通的函数就完成这个变动的。任何时候,你写一段代码,如果它将会被用于多于一个地方,你就要考虑把它放入一个库里了。
其它还有什么?
显然还有很多我没有谈到的事,告诉我你的想法,我将在下一篇文章中来讨论它们。特别地是,如果你写了一个大型的、复杂的应用程序,我想听听你是如何规划它的及你重做时不什么不同的想法。
相关文章
- php和asp网络验证码,Verifycode 1个简单的网页图片验证码的示例程序,基本上现有 字和字母都可以识别。 WEB(ASP,PHP,…) 238万源代码下载- www.pudn.com…
- php 中js跳转页面跳转页面,js跳转代码_PHP页面跳转 Js页面跳转代码[通俗易懂]
- php返回json格式的{}花括号
- PHP goto:跳转到程序的指定位置
- 『抛弃MySQL,转用PHP新时代』(php废弃mysql)
- 开发Linux下PHP模块开发:实现程序性能最大化(linux下php模块)
- PHP多进程并行执行php脚本详解编程语言
- php io多路复用详解编程语言
- 强大的PHP环境,支持Redis全面提升效能(php支持redis)
- Linux更新PHP,提升程序品质(linux更新php)
- 程序快速学会在Linux中执行PHP程序(linux执行php)
- MySQL验证:PHP实现细节(php验证mysql)
- 使用PHP操作MSSQL数据库的函数实践(phpmssql函数)
- How to Connect MS SQL Database with PHP: A Quick Guide(mssqlphp)
- 测试PHP连接MS SQL 数据库的结果(php链接mssql测试)
- PHP程序实现MSSQL数据库的连接(php程序连接mssql)
- 解决办法:使用PHP支持MSSQL扩展操作(php支持mssql扩展)
- 使用PHP封装MSSQL管理数据库(php封装mssql)
- Linux平台如何高效搜索PHP文件(linux搜索php)
- PHP与MSSQL联合 处理日期数据(php mssql 日期)
- PHP与MySQL的关联技术(php关联mysql)
- PHP MySQL 组合:开发数据库应用的必备工具(php mysql数据库)
- Linux持续更新:升级PHP版本的魅力(linux升级php版本)
- PHP与MySQL实现三表关联操作(mysql三表关联pHP)
- 用PHP实现Redis的键值存储(redis键值php)
- 无数据库的详细域名查询程序PHP版(5)
- Phpbean路由转发的php代码
- php入门学习知识点一PHP与MYSql连接与查询
- php批量替换html标签的实例代码
- PHP只允许指定IP访问(允许*号通配符过滤IP)